c++ primer 笔记第八章

第八章 IO库

梗概:本章主要介绍了C++标准IO库,包括iostream标准输入输出,fstream文件输入输出和sstream字符串输入输出。

8.1 IO类

io类主要有三种,主要是定义在iostream、fstream和sstream三个头文件之中。

ifstream和istringstream都继承自istream。因此可以像使用istream一样使用其它两个类的对象。并且在使用istream的引用或者指针的地方可以使用这两个类的对象引用或指针。

8.1.1 IO对象无拷贝或赋值

io对象不能进行拷贝或者赋值,因此一般只能传递和返回IO对象的引用。

读写IO对象会改变它的状态,因此也不能使用const类型。

8.1.2 条件状态

IO操作有些异常可以恢复,有些不可以,因此IO类中有条件状态显示。

strm::iostate 当前状态   strm::failbit badbit goodbit eofbit以及对应的成员函数。

s.clear() s.clear(flags) 为清除所有标志位和清除特定标志位。s.setstate(flags) 设置特定标志位。 s.rdstate() 返回当前状态。

flags和当前状态的类型为strm::iostate。

只有当流处于无错状态时才可以进行读写,把流用在判断时判断的是它的状态。

badbit表示系统级错误,无法恢复。此时failbit同样置位。

只有failbit置位时表示可恢复的错误,如读取的类型不符。

eofbit表示文件结束,此时同样置位failbit。

cin.clear() 清除所有标志位,cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit)表示清除failbit和badbit位。 

练习8.1

istream& test(istream& is) {
	string s;
	while (is >> s)
		cout << s << endl;
	cout << is.rdstate() << endl;
	is.clear();
	cout << is.rdstate() << endl;
	return is;
}

练习8.3 1.当接收文件结束符时 2.当输入流崩溃时  3. 当输入的数据和i的类型不符时

8.1.3 管理输出缓冲

每个输出流都有一个缓冲区,缓冲区刷新才会将内容输出到指定位置。

unitbuf可以设置默认的输出流是否缓冲。输出流缓冲区刷新的N种情况。

endl刷新并换行, ends刷新加空格, flush只刷新。

程序异常终止时缓冲区的内容不输出。

输入流输出流可以进行关联,每个流可以最多关联一个流,但一个流可以同时被多个关联。

若cin关联cout,那么cin进行读取输入之前,cout的缓冲区会被刷新。

cin.tie(&cout) cin关联cout,  cin.tie()返回当前cin关联的流且取消关联。

8.2 文件输入输出

文件流fstream包括ifstream和ofstream分别是从文件中读取数据和向文件中写入数据。

8.2.1 使用文件流对象

创建文件流对象fstream三种模式:fstream fstrm;  fstream fstrm(file);   fstream fstrm(file, mode);

后两种模式自动调用open函数进行关联文件,文件名可以是string或者C风格字符串数组。

fstream继承自iostream,因此可以使用fstream的对象代替iostream的对象。

如果open文件失败,failbit会置位,尽量检测是否成功打开文件。

一个文件流只能关联一个文件,再关联会失败。先用close关闭关联文件再进行关联其它文件。

文件可以被多个文件流关联。

文件流对象在离开作用域时自动调用close函数并销毁。

练习8.4

vector<string> readFile(string fileName) {
	vector<string> res;
	ifstream input(fileName);
	if (input) {
		string s;
		while (getline(input, s))
			res.push_back(s);
	}
	else
		cout << "Could not open file " << fileName << endl;
	return res;
}

练习8.5

getline(input, s) 改为 input >> s

练习8.6 程序不变

8.2.2 文件模式

用文件流打开文件时都有一个文件模式包括:in写 out读 app附加 ate立即设定末尾 trunc截断(清空) binary(二进制)

out且没其它设定可以trunc模式。 没有trunc就可以app。app默认out模式。

out默认trunc,想附加可以使用app。 ate和binary可以和其它混合。

ofstream out("file1", ofstream::app | ofstream::out);设置为附加模式。

每次关联都必须有文件模式。

8.3 string流

istringstream从字符串读取数据, ostringstream往字符串写数据。

sstream strm(s)绑定字符串。 strm.str()返回绑定的字符串拷贝。 strm.str(s)绑定字符串s,返回void。

继承自iostream,同样使用<< 和 >>。

练习8.10

void readFileWords(string fileName) {
	vector<string> text;
	ifstream input(fileName);
	string tmp;
	if (input) {
		while (getline(input, tmp))
			text.push_back(tmp);
		for (auto line : text) {
			istringstream si(line);
			while (si >> tmp)
				cout << tmp << endl;
		}
	}
	else
		cerr << "Could not open file " << fileName << endl;
}

练习8.11

record.str(line);

练习8.12

不需要,默认构造函数即可。

猜你喜欢

转载自blog.csdn.net/qq_25037903/article/details/81748219