三个类:
ofstream: 写文件流
ifstream: 读文件流
fstream: 读写文件流
基本使用
1 2 3 4 5 6 7 8 9 10 11 12 #include <iostream> #include <fstream> using namespace std;int main () { ofstream myfile; myfile.open ("example.txt" ); myfile << "Writing this to a file.\n" ; myfile.close (); return 0 ; }
打开文件 类对象需要跟一个实际文件关联起来,程序中打开的文件使用“流”来表示,对“流”的操作会反应到实际文件中。
mode
desc
ios::in
输入,相对CPU来说
ios::out
输出,相对CPU来说
ios::binary
二进制文件
ios::ate
文件指针起始位置放到文件末尾
ios::app
追加
ios::trunc
截断
操作文本文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> #include <fstream> using namespace std;int main () { ofstream myfile ("example.txt" ) ; if (myfile.is_open ()) { myfile << "This is a line.\n" ; myfile << "This is another line.\n" ; myfile.close (); } else cout << "Unable to open file" ; return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream> #include <fstream> #include <string> using namespace std;int main () { string line; ifstream myfile ("example.txt" ) ; if (myfile.is_open ()) { while ( getline (myfile,line) ) { cout << line << '\n' ; } myfile.close (); } else cout << "Unable to open file" ; return 0 ; }
文件状态
bad(): 读写操作失败时,比如写一个没有打开的文件,或者磁盘满了
fail(): 除了bad()的情况,还有读写格式错误,也算fail()
eof(): 读到文件末尾了
good(): 大部分都是good(),但不跟bad()互补,good()会检查更多的flags
clear(): 清理状态flags
操作流的位置
tellg(): tell get position, 读位置
tellp(): tell put position, 写位置
seekg(): 设置读的位置
seekp(): 设置写的位置
ios::beg: 从流的开始开始
ios::cur: 从流的当前位置开始
ios::end: 从流的末尾开始
注意 tellg()这些的返回值类型: streampos begin, end;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <iostream> #include <fstream> using namespace std;int main () { streampos begin,end; ifstream myfile ("example.bin" , ios::binary) ; begin = myfile.tellg (); myfile.seekg (0 , ios::end); end = myfile.tellg (); myfile.close (); cout << "size is: " << (end-begin) << " bytes.\n" ; return 0 ; }
操作二进制文件 不能使用文本文件那种 <<
或者 getline()
这样的函数,需要用 write(), read()
1 2 write ( memory_block, size );read ( memory_block, size );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <iostream> #include <fstream> using namespace std;int main () { streampos size; char * memblock; ifstream file ("example.bin" , ios::in|ios::binary|ios::ate) ; if (file.is_open ()) { size = file.tellg (); memblock = new char [size]; file.seekg (0 , ios::beg); file.read (memblock, size); file.close (); cout << "the entire file content is in memory" ; delete [] memblock; } else cout << "Unable to open file" ; return 0 ; }
内部缓存 操作文件流时,有个内部缓存对象streambuf
,作为流和实际物理文件之间的缓冲。缓存同步时机:
文件close
内部缓存满的时候
手动刷新: flush(), endl,
手动刷新: sync()
参考:https://www.cplusplus.com/doc/tutorial/files/