理解C++中ifstream、ofstream、fstream文件输入输出
文件输入输出
头文件fstream定义了三个类型的头文件:
1、ifstream从一个给定文件读取数据
2、ofstream向一个给定文件写入数据
3、fstream可以读写给定文件
fstream除了继承了iostream类型的行为外,还增加了一些新的功能,所以IO类型不能调用这些新的功能:
1、使用文件流对象
输入流in用于初始化从文件中读取数据。在C++新标准中,文件名既可以是库类型string对象,也可以是C风格字符数组,旧版本的标准库只允许C风格字符数组。
用fstream代替iostream&:
可以用fstream或sstream类型去调用iostream类型引用或指针参数的函数
成员函数open和close:
如果我们定义了一个空文件流对象,可以随后调用open来将它与文件关联起来。
open失败,failbit会被置位。因为调用open可能会失败,所以检查open是否成功是个好习惯,例如:if(out);//来检查out是否被open了,成功即可使用文件
close用于关闭文件。为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件。一旦文件关闭成功,我们便可以打开新的文件了。
自动构造和析构:
当一个fstream对象被销毁时,close会自动被调用。
demo 1:
#include<iostream>
#include<vector>
#include<string>
#include<fstream>
using namespace std;
int main(void)
{
ifstream in("data");//打开文件
if (!in)
{
cerr << "无法打开输入文件!" << endl;
return -1;
}
string line;
vector<string> words;
while (getline(in, line))//从文件中读取一行
{
words.push_back(line);//添加到vector中
}
in.close();//输入完毕,关闭文件
vector<string>::const_iterator it = words.begin();//迭代器
while (it != words.end())//遍历输出vector中的元素
{
cout << *it << endl;
++it;
}
//return 0;
system("pause");
}
demo 2:
#include<iostream>
#include<fstream>
#include"Sales_data.h"
using namespace std;
int main(void)
{
if(argc!=2)
{
cerr<<"请给出文件名"<<endl;
return -1;
}
ifstream in(argv[1]);
if(!in)
{
cerr<<"无法打开输入文件"<<endl;
return -1;
}
Sales_data total;
if(read(in,total))
{
Sales_data trans;
if(total.isbn()==trans.isbn())
total.combine(trans);
else
{
print(cout,total)<<endl;
total=trans;
}
print(cout,total)<<endl;
}
else
{
cerr<<"没有数据"<<endl;
}
return 0;
}
2、文件模式
流的文件模式:
in | 以读方式打开 |
out | 以写方式打开 |
app | 每次写操作前均定位到文件末尾 |
ate | 打开文件后立即定位到文件末尾 |
trunc | 截断文件 |
binary | 以二进制方式进行IO |
指定文件模式的限制:
1、只可以对ofstream或fstream对象设定out模式
2、只可以对ifstream或fstream对象设定in模式
3、只有当out也被设定时才可设定trunc模式
4、只要trunc没被设定,就可以设定app模式。在app模式下,即使没有显示指定out模式,文件也总是以输出方式被打开
5、默认情况下,即使没有指定trunc模式,以out模式打开的文件也会被截断。为了保留以out模式打开的文件,我们必须同时指定app模式;或者同时指定in模式,即同时对同一个文件读写操作
6、ate和binary模式可以用于任意类型的文件流对象,且可以与其他任何文件模式组合使用
默认打开方式:ifstream关联的文件默认用in模式打开;ofstream关联的文件默认用out模式打开;fstream关联的文件默认以in和out模式打开
以out模式打开文件会丢弃已有的数据:
保留被ofstream打开的文件中的已有数据的唯一方法是显示指定app或in模式
每次调用open时都会确定文件模式:
在每次打开文件时,都要设置文件模式,可能是显式地设置,也可能是隐式地设置。当程序未指定模式时,就使用默认值。
demo 3:
#include<iostream>
#include<fstream>
#include"Sales_data.h"
using namespace std;
int main(void)
{
if(argc!=3)
{
cerr<<"请给出文件名"<<endl;
return -1;
}
ifstream in(argv[1]);
if(!in)
{
cerr<<"无法打开输入文件"<<endl;
return -1;
}
ofstream out(argv[2]);
if(!out)
{
cerr<<"无法打开输出文件"<<endl;
return -1;
}
Sales_data total;
if(read(in,total))
{
Sales_data trans;
if(total.isbn()==trans.isbn())
total.combine(trans);
else
{
print(cout,total)<<endl;
total=trans;
}
print(cout,total)<<endl;
}
else
{
cerr<<"没有数据"<<endl;
}
return 0;
}
demo 4:
将ofstream out l(argv[2]);改为ofstream out(argv[2],ofstream::app);