欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++ primer 笔记第八章IO库

程序员文章站 2024-03-21 14:28:22
...

第八章 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

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

相关标签: C primer