iostream 标准库,它提供了 cin 和 cout 方法分别用于 从标准输入读取流 和 向标准输出写入流。
在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件
| 数据类型 | 作用 |
|---|---|
| ofstream | 输出文件流,用于创建文件并向文件写入数据 |
| ifstream | 输入文件流,用于从文件读取数据到流中 |
| fstream | 表示通用文件流,具有ofstream和ifstream的两种功能,所以它能够创建文件,向文件写入数据,从文件读取数据 |
| 标志 | 作用 |
|---|---|
| ios::app | 在文件末尾追加写入 |
| ios::ate | 文件打开后定位到文件末尾 |
| ios::in | 打开文件用于读取文件内容 |
| ios::out | 打开文件用于写入文件内容 |
| ios::trunc | 截断文件,当目标文件存在时,将文件长度设为0 |
使用ofstream和 流插入运算符<< 写入数据
char data[20];
ofstream outstream;//输出文件流 创建文件并写入文件
//打开文件(追加写的方式/不存在的时候创建)
outstream.open("E:\\myCcode\\testFileOperation\\test.txt",ios::app);
outstream << "测试一下写文件..." << endl;
outstream.close();
执行结果

使用ifstream和 流提取运算符>> 读取刚刚创建文件test.txt并写入的数据(第一行)
ifstream instream;//输入文件流 读取文件
//打开文件(读)
instream.open("E:\\myCcode\\testFileOperation\\test.txt");
instream >> data;
cout << "读取文件获得的内容:" <<data << endl;
instream.close();
执行结果

使用ofstream、ifstream、fstream的成员函数close()关闭打开的文件。
istream的seekg和ostream的seekp
istream 的 seekg(“seek get”)和关于 ostream 的 seekp(“seek put”)
使用seekg(),文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。
//定位文件中内容位置 内容为:测试一下汉字编码是否正常
instream.open("E:\\myCcode\\testFileOperation\\testLocated.txt");
instream.seekg(6);//注意,一个汉字占两个字节
instream >> seekdata;//这里作为流缓冲区不需要初始化
cout << "读取文件定位后获得的内容:" << seekdata << endl;
instream.close();
执行结果

//文本内容:测试一下汉字编码是否正常
instream.seekg(6);//这里注意汉字占2个字节,读取时可能会变成乱码
instream >> seekdata;
cout << "读取文件定位后获得的内容:" << seekdata << endl;
instream.close();
文件编码
直接新建编辑的文本文件格式是UTF-8

输出内容为乱码

当把编码格式修改为ANSI时

可以正常输出,不会有乱码了

定位汉字字节位置问题
在ANSI中一个汉字占两个字节,英文占一个字节,所以在定位的时候,如果定位到了汉字的第二个字节位置并对后续内容进行输出,会导致汉字乱码
例:
文本内容为:测试一下汉字编码是否正常
1.如果使用seekg()定位第7个字节,会定位到“下”的第二个字节,就会出现乱码

2.定位第6个字节,会输出“下汉字编码是否正常”
