文件IO类
头文件fstream定义了三种类型来支持文件 IO,ifstream从一个给定的文件读取数据,ofstream向一个给定文件写入数据,fstream可以读写给定文件,当文件流对象被销毁时,会自动关闭绑定的文件。
int main(void)
{
//创建一个未绑定的文件流
std::fstream file1;
std::ifstream file2;
std::ofstream file3;
//创建一个文件流,以默认的模式(根据文件流的类型)打开文件,然后与流绑定
std::fstream file4("1.txt");
std::ifstream file5("1.txt");
std::ofstream file6("1.txt");
//创建一个文件流,以指定模式打开文件,然后与流绑定
std::fstream file7("1.txt",std::ios_base::app);
std::ifstream file8("1.txt", std::ios_base::app);
std::ofstream file9("1.txt", std::ios_base::app);
//打开一个文件,然后与流绑定
file7.open("1.txt");
file7.open("1.txt", std::ios_base::app);
//关闭与流绑定的文件
file7.close();
//指出与流绑定的文件是否成功打开且尚未关闭
file7.is_open();
system("pause");
return 0;
}
fstream重载了bool运算符,所以我们可以通过if语句判断fstream是否成功打开了文件。
int main(void)
{
std::ifstream in("1.txt");
if (in) {
std::cout << "open file success" << std::endl;
}
else {
std::cout << "open file failed" << std::endl;
std::cout << in.rdstate()<< std::endl;
}
system("pause");
return 0;
}
文件模式
ios_base定义了一组flag来控制文件处理模式,这些flag可以用操作符|来组合,每个文件流类型都定义了一个默认的文件模式,ifstream默认以in模式打开,ofstream默认以out模式打开,fstream默认以in|out模式打开。
flag | 描述 |
in | 打开,用于读取 |
out | 打开,用于写入 |
app | 写入始终位于文件尾部 |
ate | 打开文件后令读/写位置移至文件尾部(at end) |
trunc | 将先前文件的内容抹除 |
binary | 二进制模式,不要替换特殊字符,例如换行 |
flag | 描述 | C模式(fopen) |
in | 读取文件,来源文件必须存在 | r |
out | 清空后写入 | w |
out|trunc | 清空后写入 | w |
out|app | 追加 | a |
app | 追加 | a |
in|out | 读和写,最初位置在起点,来源文件必须存在 | r+ |
in|out|trunc | 清空后读写 | w+ |
in|app | 在尾端读写 | a+ |
in|out|app | 在尾端读写 | a+ |
指定文件模式有如下限制:
- 只可以对ofstream或fstream对象设定out模式。
- 只可以对ifstream或fstream对象设定in模式。
- 只有当out也被设定时才可设定trunc模式。
- trunc模式和app模式不能同时使用。
- app模式下不用显式指定out模式也能以写入方式打开文件。
- 默认情况下即使没有trunc模式,out模式也会将之前的文件内容清除,为了保留文件内容,我们可以同时指定in模式或app模式。
- 有些flag不是标准规格的一部分,不具有可移植性,例如nocreate(打开文件时文件必须存在)。