一、cin,cout
iostream 标准库,它提供了 cin 和 cout 方法分别用于 从标准输入读取流 和 向标准输出写入流。
二、文件的读写
在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream> 和 <fstream>
数据类型 | 作用 |
---|---|
ofstream | 输出文件流,用于创建文件并向文件写入数据 |
ifstream | 输入文件流,用于从文件读取数据到流中 |
fstream | 表示通用文件流,具有ofstream和ifstream的两种功能,所以它能够创建文件,向文件写入数据,从文件读取数据 |
1.打开文件
- 在从文件读取信息或者向文件写入信息之前,必须先打开文件。
- ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果需要打开文件进行读操作,则使用 ifstream 对象。
- 使用 open(const char *filepath,ios::openmode mode) 成员函数打开文件,并返回流对象
第二个参数是指定打开方式,有一些标志:标志 作用 ios::app 在文件末尾追加写入 ios::ate 文件打开后定位到文件末尾 ios::in 打开文件用于读取文件内容 ios::out 打开文件用于写入文件内容 ios::trunc 截断文件,当目标文件存在时,将文件长度设为0
2.写入文件
-
使用ofstream和 流插入运算符<< 写入数据
char data[20]; ofstream outstream;//输出文件流 创建文件并写入文件 //打开文件(追加写的方式/不存在的时候创建) outstream.open("E:\\myCcode\\testFileOperation\\test.txt",ios::app); outstream << "测试一下写文件..." << endl; outstream.close();
-
执行结果
3.读取文件
-
使用ifstream和 流提取运算符>> 读取刚刚创建文件test.txt并写入的数据(第一行)
ifstream instream;//输入文件流 读取文件 //打开文件(读) instream.open("E:\\myCcode\\testFileOperation\\test.txt"); instream >> data; cout << "读取文件获得的内容:" <<data << endl; instream.close();
-
执行结果
4.关闭文件
使用ofstream、ifstream、fstream的成员函数close()关闭打开的文件。
5.定位文件内容
-
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();
-
执行结果
三、遇到的问题
1.定位文件内容输出乱码
- 代码
//文本内容:测试一下汉字编码是否正常 instream.seekg(6);//这里注意汉字占2个字节,读取时可能会变成乱码 instream >> seekdata; cout << "读取文件定位后获得的内容:" << seekdata << endl; instream.close();
- 问题原因
-
文件编码
直接新建编辑的文本文件格式是UTF-8
输出内容为乱码
当把编码格式修改为ANSI时
可以正常输出,不会有乱码了
-
定位汉字字节位置问题
在ANSI中一个汉字占两个字节,英文占一个字节,所以在定位的时候,如果定位到了汉字的第二个字节位置并对后续内容进行输出,会导致汉字乱码
例:
文本内容为:测试一下汉字编码是否正常
1.如果使用seekg()定位第7个字节,会定位到“下”的第二个字节,就会出现乱码
2.定位第6个字节,会输出“下汉字编码是否正常”
-