8.2 文件输入和输出
标准库定义文件输入和输出流定义在fstream文件中,包含了3三个操纵文件的类
ifstream //从文件中读取
ofstream //向文件中输出
fstream //可读可写
以上三个类都是iostream的子类,所以可以使用iostream的所有操作,初次之外,他还定义了其他的操作。
1.总结起来就是我们在创建文件流对象的时候就可以关联文件。
2.也可以稍后再打开(关联)文件。
3.同时还可以关闭关联的文件和
4.判断关联的文件是否成功打开。
因为fstream是iostream的子类,所以在iostream能用的地方,传入fstream也可以使用。
关于open和close
如果文件open失败,那么failbit会被制位,而且文件open失败是很正常的事情,所以判断文件是否open成功是一个好习惯。
如果open成功,会和一个文件进行关联,如果此时没有关闭close和这个文件的关联,那么再open文件就会失败(即使是open同一个文件),这也会导致failbit激活。
对于局部的普通流对象,如果所在块的作用域运行结束,对象会被销毁,销毁的同时会自动的执行close();
练习
8.4
8.5
ifstream in("hello.txt");
std::string str = "";
std::vector<std::string> str_vec;
//while(in>>str){ //读取单个单词
while (std::getline(in,str)) { //读取一行
//cout << str << endl;
str_vec.push_back(str);
}
for (const auto &item:str_vec) {
cout << item << endl;
}
8.6
ifstream in("shop_data.txt");
Sales_data total;
if (input(in,total)){
Sales_data trans;
while (input(in,trans) ){
if (total.isbn()==trans.isbn()) {
total.combine(trans);
}
else
{
print(cout,trans)<<endl;
}
}
print(cout, total) << endl;
}
else {
std::cerr << "No data?!" << endl;
}
唯一修改的地方就是从cin变成了文件流对象。
8.2.2 文件模式
每个流关联文件的时候,都会有一个文件模式。用来表明他关联文件的具体操作模式。
文件模式有以下几种:
所谓的截断文件,就是文件中原本的内容会被删除。
我们在关联(打开)文件的时候,设置文件模式。
需要注意的是
1.ifstream和fstream可以设置in模式
2.ofstream和fstream可以设置out模式
3.只有下out模式下可以设置截断,默认情况下ofstream包含out和截断
4.如果想在out‘模型下保存文件内容,为文件设置app模式,对于fstream还可以设置in模式
5.ate和binary可以加在所有读写模式中。
ifstream 默认情况下是in模式
ofstream默认情况下是out模式和截断模式
我们可以自己设置ofstream的追加模式。
ofstream out("123.txt")//out+截断
ofstream out("123.txt",ofstream::out)//out+截断
ofstream out("123.txt",ofstream::app)//out+app
ofstream out("shop_date.txt",ofstream::out|ofstream::app);
每次调用open的时候我们都需要设定文件模式。
练习
8.7 and 8.8
因为经常使用IDE。main怎么传参都给忘了= =
需要记住,main中第一个参数是后面的字符串数量,第二个参数是字符串数组。
ofstream out("shop_data.txt",ofstream::out|ofstream::app);
Sales_data total;
if (input(cin,total)){
Sales_data trans;
while (input(cin,trans) ){
if (total.isbn()==trans.isbn()) {
total.combine(trans);
}
else
{
print(cout,total)<<endl;
print(out, total) << endl;
total = trans;
//out.flush();
}
}
print(out, total) << endl;
}
else {
std::cerr << "No data?!" << endl;
}