c++ primer 笔记第八章IO库
第八章 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
不需要,默认构造函数即可。
上一篇: csv转其他语言(lua)代码文件
下一篇: mysql的树状表结构设计。