总结一下最近用C++写系统时用到的关于文件流输入输出的相关内容。
(最近真的是在怀疑人生了……大一学C++我到底都学了些啥???少壮不努力老大徒伤悲……书到用时方恨少,是非经过不知难……以前欠下的现在都会还回来的……)
一、C++中支持文件输入输出的几个类
fstream提供了三个类,用来实现对文件的操作。
- fstream——打开文件以供读写
- ifstream——从文件中读取内容
- ofstream——向文件中写入内容
二、文件读入与输出的一些操作
1. 打开一个文件
被打开的文件在程序中用一个流对象来表示,对该对象所做的任何输入输出操作实际上就是对该文件所做的操作。
open( ) 函数用来打开一个文件:
void open ( const char* filename, openmode mode);
filename代表要打开的文件名, mode是打开的方式,是以下标识符的组合:
- ios::in 只读
- ios::out 只写
- ios::app 从文件末尾开始写
- ios::binary 二进制方式
- ios::nocreate 打开一个文件时,如果文件不存在,不创建文件
- ios::noreplace 打开一个文件时,如果文件不存在,创建该文件
- ios::trunc 如果文件已存在则先删除该文件
- ios::ate 打开一个文件时,将初始位置移动到文件尾
标识符组合使用时用或(|)操作符隔开
例如,想要打开“ helloworld.txt”文件写入一些数据:
ofstream file;
file.open( "helloworld.txt", ios::out | ios::app )
ofstream, ifstream 和 fstream 的成员函数 open( ) 都有默认的打开文件的方式:
- ofstream —— ios::out | ios::trunc
- ifstream —— ios::in
- fstream —— ios::in | ios::out
2. 判断文件是否打开成功
可以通过调用成员函数 is_open( ) 来检查一个文件是否已经被顺利的打开了:
bool is_open();
返回 true 代表文件已经被顺利打开,返回 false 则相反。
3. 关闭文件
当文件读写操作结束以后,需要关闭文件,让文件重新变成可访问状态。
close( ) 成员函数负责将缓存中的数据清除并关闭文件。
调用 close( ) 后, 原来的流对象就可以打开其他的文件, 且该文件可以重新被其他的进程所访问。
不过析构函数将自动调用 close 函数以防止流对象被销毁时还联系着打开的文件。
4. 一些验证流的状态的成员函数(返回值均为bool型)
- bad()
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
- fail()
除了与bad() 同样的情况下会返回 true 以外,格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
- eof()
如果读文件到达文件末尾,返回true。
- good()
文件打开成功则返回true。
重置以上成员函数所检查的状态标志,可以使用成员函数clear()。
5. 流缓冲rdbuf()
rdbuf()用于获取/设置流缓冲区。可以实现一个流对象指向的内容用另一个流对象来输出。
例如:cin.rdbuf( )->in_avail( )
rdbuf( ) 获取cin的输入缓冲区。in_avail 获取输入缓冲区中存在的字符数。
整句话的意思就是获取 cin 缓冲区中还有多少字节没有处理的数据。
三、文件读取与写入示例:
因为类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。所以fstream 的对象可以使用其父类的成员来访问数据。可以使用这些类与同控制台(console)交互同样的成员函数(cin 和 cout)来输入输出。
- 读取string类型的文件:可以使用getline( )
// Read from a text file
#include <iostream>
#include <string>
#include <fstream>
int main(){
ifstream in_file("in_example.txt");
ofstream out_file("out_example.txt");
string buffer;
if(!in_file.is_open()){ //判断文件是否打开成功
cout << "Failed to open file, pls check if file is exist or not.\n";
}
while(!in_file.eof()){ //判断文件是否读取到末尾
in_file.getline(buffer, 100);
out_file << buffer;
out_file << endl;
}
in_file.close();
out_file.close();
return 0;
}
- 读取int类型的数据:
如: in_file >> n1 >> n2;
……
(以后遇到相关问题再来更新~)
以前觉得文件读入和输出好复杂好难,其实只要自己试几遍,就能大致会用了,so 继续加油鸭!