fstream fstrm | 创建一个未绑定的文件流。fstream是头文件中定义的一个类型 |
fstream fstrm(s) | 创建一个fstream,并打开名为s的文件。s可以是string类型,或者是一个指向C风格字符串的指针。这些构造函数是explicit的。默认的文件模式mode依赖于fstream的类型 |
fstream fstrm(s,mode) | 与前一个构造函数相似,但按指定mode打开文件 |
fstrm.open(s) | 打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向C风格字符串指针。默认的文件mode依赖于fstream的类型。返回void. |
fstrm.close() | 关闭与fstrm绑定的文件,返回void |
fstrm.is_open() | 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭 |
ifstream in(ifile);//构造一个ifstream并打开给定文件
ofstream out;//输出文件流未关联到任何文件
#include
using namespace std;
#include
class Book
{
public:
Book():sellSum(0),isbn(0),price(0){
}
int isbn;//书本的编号
int price;//书本的价格
int sellSum;//该书的销售总额
};
//输入卖出书本的编号,价格
istream& read(istream& is, Book& item)
{
int sumValue = 0;
//从文件中读取信息存入item中
is >> item.isbn >> item.price;
return is;
}
//输出卖出书本的编号,价格和销售总额
ostream& print(ostream& os, Book& item)
{
//输出信息并写入当前文件中
cout<<"当前书本的编号为: " << item.isbn << " 价格: " << item.price << " 销售总额: " << item.sellSum << endl;
os << "当前书本的编号为: " << item.isbn << " 价格: " << item.price << " 销售总额: " << item.sellSum << endl;
return os;
}
int main(int argc, char** argv)
{
ifstream input("read.txt");//打开销售记录文件
if (!input.is_open())
cerr << "文件打开失败" << endl;
ofstream output("print.txt");//打开输出文件
if (!output.is_open())
cerr << "文件打开失败" << endl;
Book total;//保存销售总额变量
while (read(input,total))//读取销售记录
{
total.sellSum += total.price;
print(output, total) << endl;
}
return 0;
}
重要的部分是对read和print的调用,虽然两个函数定义时指定的形参分别是istream&和ostream&,但我们可以向他们传递fstream对象
ifstream in(ifile);//构筑一个ifstrean并打开给定文件
ofstream out;//输出文件流未与任何文件关联
out.open(ifile + ".copy");//打开指定文件
failbit用来指出一个IO操作失败了
因为调用open可能失败,进行open是否成功的检测是一个好习惯:if(out)//检查open是否成功,如果open成功,我们就可以使用文件了
实际上,对一个已经打开的文件流调用open会失败,并会导致failbit被置位.
随后的试图使用文件流的操作都会失败。为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件。一旦文件成功关闭,我们可以打开新的文件。
in.close();//关闭文件
in.open(ifile+"2");//打开另外一个文件
#include
using namespace std;
#include
#include
#include
istream& read(istream& is, string& item)
{
int sumValue = 0;
is >> item;
return is;
}
void print(string& item)
{
//输出信息
cout<<item << " ";
}
int main(int argc, char** argv)
{
vector<string> s = {
"1.txt","2.txt","3.txt","4.txt","5.txt" };
string item;
for (int i = 0; i < s.size(); ++i)
{
ifstream input(s[i]);
read(input, item);
print(item);
}
return 0;
}
当一个fstream对象被销毁时,close会被自动调用
in | 以读的方式打开 |
out | 以写的方式打开 |
app | 每次写操作前均定位到文件末尾 |
ate | 打开文件后立即定位到文件末尾 |
trunc | 截断文件 |
binary | 以二进制方式进行IO |
无论哪种方式打开文件,我们都可以指定文件模式,调用open打开文件时可以,用一个文件名初始化流来隐式打开文件可以。指定文件模式有如下限制:
每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式的时候,就使用默认模式。
与ifstream关联的文件默认以in模式打开;
与ofstream关联的文件默认以out模式打开;
与fstream关联的文件默认以in和out模式打开。
、
默认情况下,当我们打开一个ofstream时,文件的内容会被丢弃。阻止一个ofstream清空给定文件内容的方法是同时指定app模式:
//在这几条语句中,file1都被截断
ofstream out("file1");//隐含的以输出模式打开文件并截断文件
ofstream ou2("file1",ofstream::out);//隐含的截断文件
ofstream out3("file1",ofstream::out|ofstream::trunc);
//为了保留文件内容,我们必须显示指定app模式
ofstream app("file2",ofstream::app);//隐含为输出模式
ofstream app2("file2",ofstream::out|ofstream::app);
保留被ofstream打开的文件中已有的数据的唯一方法是显示指定dpp或者in模式.
对于一个给定流,每当打开文件时,都可以改变其文件模式:
ofstream out;//未指定文件打开模式
out.open("scratchpad");//模式隐含设置为输出和截断
out.close();//关闭out,以便我们将其用于其他文件
out.open("a",ofstream::app);//模式为输出和追加
out.close();
通常情况下,out模式意味着同时使用trunc模式,使用trunc模式打开一个已经写了数据的文件,文件里面的内容会被全部清空
每次打开文件时,都要设置文件模式,可能是显示设置,也可能是隐式地设置。当程序未指定模式前,就使用默认值