打开文件有三步:
1. 打开文件的方法
创建一个文件流,并绑定一个文件。
操作 | 说明 |
---|---|
fstream fs; | 创建一个未绑定的流fs |
fstream fs(s); | 创建一个流,并打开名为s的文件,s可以是string或C风格字符串 |
fstream fs(s, mode); | 同上,并指定以mode模式打开 |
如果创建的时候没有绑定,也可以用open()
函数打开:
fs.open(s); //s可以是string或C风格字符串
//默认的mode依赖于fstream类型
请养成检测open是否成功的习惯!
注意:
一旦一个文件流已经打开,它就保持与对应文件的关联。实际上,对一个已经打开的文件流调用open 会失败,并会导致failbit被置位。随后的试图使用文件流的操作都会失败。为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件。一旦文件成功关闭,我们可以打开新的文件。
1.1 文件模式
也就是之前说的mode,常见的mode如下:
模式 | 说明 | 要求 |
---|---|---|
in | 读 | 不能是ofstream |
out | 写,默认会同时trunc | 不能是ifstream |
app | 每次写操作都定位到文件末尾 如果只设置了app则默认也指定out | trunc没被设定 |
ate | 打开文件后立即定位到文件末尾 | |
trunc | 截断文件 | 必须设置了out |
binary | 以二进制方式进行IO |
如:
ofstream out;
out.open("a.txt", ios::app);
//有时候也用下面的样子:
//out.open("a.txt", ostream::app);
每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用此默认模式。与 ifstream关联的文件默认以in模式打开;与ofstream关联的文件默认以out模式打开;与fstream 关联的文件默认以in和 out模式打开。
如果我们想自己指定文件模式,则需要遵循上表规则。
注意:ofstream打开一个文件时,文件的内容会被丢弃,阻止一个ofstream清空的唯一方式是显式指定app
或in
模式
1.2 判断打开是否成功
可以用is_open()
函数判断文件是否成功打开且尚未关闭:
fs.is_open(); //返回bool值
2. 读取内容
直接看示例吧:
// 前情提要(需要的变量)
istream ifs(s);
string s;
char c;
char tmp[1024];
第一种:
// 第一种:>>
string tmp;
while (ifs >> tmp)
{
cout << tmp << endl;
}
// 这种方法会从ifs中逐个单词读取(也就是遇到空格、换行时会停止)
第二种:
// 第二种:getline()
while (getline(ifs, s)) //1024是单次读取的最大字符数量
{
cout << s << endl;
}
// 可以和sstream结合使用
// 或者:
while (ifs.getline(tmp, 1024)) //注意上面的可以对string使用, 而这个是char*
{
cout << tmp << endl;
}
第三种:
// 第三种:get()
while( (c = ifs.get()) != EOF)
{
cout << c; //一个字符一个字符输出
}
// 不推荐,效率低
3. 关闭文件
f.close();