目录
C语言使用 fread / fwrite 函数来实现二进制读写,使用 fgetc /fputc / fgets / fputs 实现文本/字符串的读写。值得注意的是二进制读写不需要分隔符,文本/字符串的读写需要有分隔符,否则读取的时候会因为找不到分隔符而达不到想要的效果。
C++也有对应的读写类(ifstream / ofstream)来让我们达到读写文件的目的,二进制读写使用的是 read / write,文本的读写使用的是 流提取(>>) 和 流插入(<<)。
C++打开文件的方式并不是通过调用函数的方式,而是调用构造函数的方式来打开文件。
读形式打开:
- // 文本的形式读:
- ifstream ifs("文件路径");
- // 二进制的形式读:
- ifstream ifs("文件路径", ifstream::in | ifstream::binary);
写形式打开:
- // 文本的形式读:
- ifstream ofs("文件路径");
- // 二进制的形式读:
- ofstream ofs("文件路径", ofstream::out|ofstream::binary);
关闭文件的话,可以主动调用 close 函数,也可以在销毁对象时自动调用析构函数。
虽说是二进制读写,即便是普通的文本读写也是支持的,只不过使用流插入/流提取进行文本读写更加方便。这里使用的头文件是 fstream。
函数声明如下:
第一个参数:要写入的数据(如果不是char*类型,需要强转成char*类型)
第二个参数:数据所占字节数
返回值:返回一个输出流对象的引用(一般不考虑返回值)
- ofstream ofs("D:\\data.txt", ofstream::out | ofstream::binary);
- const char* str = "hello";
- ofs.write(str, sizeof(str));
- ofs.close();
函数声明如下:
第一个参数:数据读取到以后,要存到哪个地址
第二个参数:可以用于存储的空间所占字节数
返回值:返回一个输入流对象的引用(一般不考虑返回值)
- ifstream ifs("D:\\data.txt", ifstream::in | ifstream::binary);
- char* pstr = new char[5];
- ifs.read(pstr, sizeof(pstr));
文本的读写可以使用 流插入或者流提取来实现更加方便快捷。首先要创建流的对象,然后使用流插入或者流提取来进行读写。
- ofstream ofs("D:\\data.txt");
- ofs << "张三" << " " << 18; // 文本形式写入的时候,不同数据需要使用空格或者换行隔开
- ofs.close();
- ifstream ifs("D:\\data.txt");
- char name[10] = { 0 };
- int age;
- ifs >> name >> age; // 读取的时候,根据分隔符判断一个数据是否读取结束
- //然后继续读取下一个,依次存入变量中
- ifs.close();
-
- cout << name << " " << age;
注意:流插入和流提取仅支持内置类型,如果要支持自定义类型,需要重载 流提取和流插入的操作符函数。