IO操作
- 了解C++中的IO操作
- C++中的二进制读写,文本读写
- C++中的stringstream类与I/O操作中对<<与>>运算符的重载
了解C++中的IO操作
我们学习IO操作,就要先了解什么是IO操作,从名字中就可以看出来,I,O就代表着输入输出的操作,那么这个输入输出和cout和cin有什么区别呢?cout和cin是固定往终端(也就是屏幕输出的),在C++中还有一些接口可以将数据输入输出到其他的文件中,这些就是我们这次要学习的。
-
ifstream
ifstream是C++在读写操作中的一种类,ifstream表示的就是读操作的文件类。通过这个类可以创建一个对象,并且与某个文件进行绑定,接着进行操作,具体如下:
比如上面的这段就是我们定义一个ifs流对象,并且将这个对象与Test.cpp这个文件进行绑定,以后的哪些操作都是在Test.cpp中进行的。 -
ofstream
和上面的相对应,ifstream表示的是读操作的文件类,那么ofstream表示的就是写操作的文件类。具体操作和上面的读是一样的,也是通过创建一个流对象来将其与一个文件进行绑定具体如下:
这句就代表我们要向Test.txt这个文件中执行写操作
注意,上面这两个文件类都是需要调用头文件#include <fstream>的
C++中的二进制读写,文本读写
-
二进制I/O操作
在C++中会给我们提供一个两个函数,分别是read函数和write函数,这两个函数是C++用来继续二进制读写文件的。先让我们了解一下这两个函数
(1) read函数
这里可以看到我们通过与文件绑定的读流,将文件中的数据,读取到对应的char* pch中具体我们实现一个读操作的函数,如下图:
我们可以通过图看到,这个函数拥有两个参数,第一个参数就代表着要存储读到的数据的字符数组,第二个参数表示我们要读取数据的字节数。
(2) write函数
和read函数一样,这个write函数也是拥有两个参数,但是不同的是,write函数是将字符数组中的数据写到一个与流绑定的文件中,也就是说,这里的第一个参数虽然也是一个字符串,但是他是一个常量字符串也就是用来传递要写的数据的,第二个参数没有发生变化,表示要发送数据的字节数。
了解完这两个函数那么就让我们看一下二进制读写是怎么实现的呢?
首先我们可以通过图中看到,我们首先创建一个流对象,并将名字为_filename的文件与其进行绑定,之后使用read函数将文件中的数据读取到一个结构体对象info中,注意read中的第一个参数是char类型的,所以我们要将结构体类型转换成char类型,后面为该要接收数据的字节数,这样我们通过read函数就将数据从文件中读取出来了放到了结构体中。
和读数据很像,写数据这里我们刚开始也是定义一个流对象并将名字为_filename的文件与其进行绑定,之后调用他的write函数,具体操作就是将info中的数据写到文件中,也就完成了二进制的写操作。 -
文本读写
上面我们了解了二进制读写,那么这个文本读写又是什么东西呢??
文本读写就是为了解决我们看不懂二进制中写操作写出来的内容的,如下图:
这里我们通过二进制写往文件中写了一个数据,之后我们打开文件后观察到,这个文件中的数据我们无法看懂,这时就展示出文本读写的要出了,那么我们开始了解文本读写。
其实文本读写和二进制读写本质上是没有什么差别的,因为文本读写我们使用的也是read函数和write函数,上面我们有说到这两个函数,这里就不具体介绍了。那么在文本读写中我们是如何使用这两个函数的呢??具体如下图:
此函数就是用来实现文本写的,和二进制写一样,首先我们先创建一个流对象,并将其和文件进行绑定,绑定之后我们先将结构体中的_ip数据写到文件中,和二进制写不一样的是这里我们写数据中的第二个参数用的是我们写到的字符数组的长度,而不是字节数了,之后我们通过put函数向文本中输入一个换行,由于之前我们在结构体中定义的_port成员变量是整形的,所以这里我们要使用to_string函数将其转换成字符串的形式,再使用write函数将该数据写到文本中,这里注意write函数的第一个参数要char类型的,所以这里我们还要使用C++中的c_str函数将string类型转换成c语言可以识别的char类型,这样我们就完成了向文本中进行文本写的操作,得到的结果如下:
这时我们就可以看到我们认识的数据了。
上面我们讲完了文件写,那么这里我们再将文件读也说明一下,当我们了解完文件写之后,文件读的本质也就显而易见了,同上,先上代码:
这里可以看到,我们也是先创建一个流对象,将其与文件进行绑定,因为文本读,所以这里我们就要使用获取一行字符串的函数了,那么这个就是getline函数,为什么使用这个函数呢,因为这个函数可以忽视空格的存在,也就是说即便你的字符串中有空格我依然可以完整的读取成功。由上图得,我们首先读取结构体中得_ip部分,200表示读取数据的长度,因为这里我们只能通过字符数组来读取数据,所以这里我们定义一个缓冲区buffer来接收字符数据,之后再将这个字符数据通过stoi函数转换成int类型的数据并将其赋给_port成员变量,这样我们就实现了文本读操作,结果如下图:
这里通过监视窗口就可以看到了我们已经将文本中的数据读出来了并将其放到了结构体中。
C++中的stringstream类与I/O操作中对<<与>>运算符的重载
上面我们解决了二进制读写和文本读写的问题,这时我们注意到,我们可以将自定义类型中的数据写到文本中以字符串的方式显示出来,那么我们可不可以不通过文件这个中介,而是直接将自定义类型中的数据转换成字符串并输出出来呢,当然也是可以的,这里就要使用strngstream类了,这个类就可以将字符串轻松的转换成我们想要的自定义类型,这里给个例子:
这里就是首先我们定义一个stringstream类对象,直接使用该类中的str函数将我们想要的字符串放到这个对象中,之后定义一个我们自定义类的对象,通过>>操作符就可以将字符串按其自定义类中成员变量的位置放进去了。那么怎么讲自定义类型中的数据直接转换成字符串类型呢,这里也需要使用stringstream类,如下:
上图我们也是定义一个stringstream类的对象s,之后将我们自定义类中的成员变量数据发送给s,然后通过缓冲区buffer将s对象中的数据传到缓冲区中,之后进行输出,这就是将stringstream的具体作用了,当然不要忘了stringstream的头文件是#include <sstream>。
你以为到这里就结束了吗,当然不是。
我们看上面是否都注意到了一点不同,为什么对象s后面可以使用 << 和 >>来进行操作呢?
这里我们就要知道一个知识点了,在C++的I/O操作中,会对这些I/O类进行一个相同的操作,那就是对输入输出运算符进行重载,也就是说我们可以直接通过输入输出的运算符来像文本中执行写操作,或者读操作,具体操作如下:
上面就是使用对<<运算符,执行文本写操作,这里我们可以将<<看成一个流,将箭头所指的方向看成数据流向的方向,这样我们就可以明白这一句的意思是将结构体info中的数据像文件_filename中写入,读数据也是相同的,如下:
这就是将文件中的数据,通过流流向了结构体中的数据,也就是读操作,将文本中的数据读到结构体中。
上面就是I/O操作的具体内容了,感谢阅读