file handling 最终话

我不想再被这个搞晕啦

线性输入输出标准流程

  1. 包含头文件:
    1. ifstream-读文件
    2. ofstrem-写文件
    3. fstream-两个都可
  2. 声明文件对象+打开文件
fstream file("test.txt", ios::in | ios::out) //这一步其实也把文件打开了
如果想分步更清晰的话:
fstream file;
file.open("test.txt");
注意:模式
用fstream 默认是in | out,
其他有用的模式还包括:
ios::binary->以二进制格式打开(不改变原文本类型)
ios::ate->开局直接把HEAD放到文件末尾,但仍可以调回前面
ios::app->强制要求必须从末尾开始,不允许读取/修改前面的内容
ios::trunc->清除源文件内容,重新开始写
  1. error handling
如果没有打开成功(e.g.文件不存在)怎么办!
1. ios::out默认自带trunc,所以在没有in时,若文件不存在会直接创建新文件
2. 如果是in模式,则必须处理错误:
		if(!file.open("test.txt")){cout<<"errpr!"<<endl;}
		或者:
		if(!file.is_open()){cout<<"eroor"<<endl;}
  1. 开始读写
正常文件读写用流“<< >>”
二进制文件
对于Plain Old Data, 如int, double, 字符数组读写用内置函数
istream& read (char* s, streamsize n)
ostream& write(char* s, streamsize n)
e.g.out_file.write(reinterpret_cast<char*>(&a), sizeof(a))
对于字符串string:
out.write(s.c_str(), s.size()); // 写入字符串的实际内容(注意是size不是sizeof)
  1. 关闭文件
file.close();

随机访问

get position: 读文件的头

put position: 写文件的头

对于fstream,二者永远一样

tellg-tellp 返回位置

seekg-seekp 跳转位置

跳转时常用: ios::beg ios::end