C++ Primer 第八章 8.2 练习和总结

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;
	}
发布了54 篇原创文章 · 获赞 6 · 访问量 3336

猜你喜欢

转载自blog.csdn.net/zengqi12138/article/details/104200835
今日推荐