笔记:
8.1 IO类
IO对象无拷贝或赋值。因此不能将形参或返回类型设置为流类型,通常以引用方式传递和返回流。且不能是const的。
将流的状态作为条件判断时,如while(cin >> i),当遇到了文件结束符,或者遇到了IO流错误,或者读入了无效数据时,循环便会终止。
当一个输入流被关联到一个输出流时,任何试图从输入读取数据的操作都会先刷新关联的输出流。标准库将cout和cin关联在一起。
8.2 文件输入输出
以out模式打开文件会丢弃已有数据,每次调用open都会确定文件模式。
调用close后才可以diaoyongopen打开另一个文件。
8.3 string流
重复使用字符串流时,每次都要调用clear
课后习题:
练习 8.1:编写函数,接受一个istream &参数,返回值类型也是istream &.此函数须从给定流中读取数据, 直至遇到文件结束标识时停止。它将读取的数据打印在标准输出上。完成这些操作后,在返回流之前,对流进行复位,使其处于有效状态。
//练习 8.1
#include <iostream>
#include <stdexcept>
using namespace std;
istream & read(istream & is)
{
int val;
while (is >> val, !is.eof()) //直到遇见文件结束符才停止读取
{
if (is.bad()) //输入流已经奔溃了
{
throw runtime_error("IO流错误");
}
if (is.fail()) //输入流发生错误,比如输入了字符,输入double类型也会引发错误,但是仍然能输出
{
cerr << "数据错误,请重试:" << endl;
is.clear();
is.ignore(100, '\n');
continue;
}
cout << val << endl;
}
is.clear();
return is;
}
int main()
{
cout << "请输入一些整数,按Ctrl+Z结束" << endl;
read(cin);
system("pause");
return 0;
}
练习 8.2:测试函数,调用参数为cin。
答:见上。
练习 8.3:什么情况下,下面的while 循环会终止?
while (cin >> i) /* ... */
答:遇到了文件结束符,或者遇到了IO流错误,或者读入了无效数据。
练习 8.4:编写函数,以读模式打开一个文件,将其内容读入到一个string 的vector中,将每一行作为一个独立的元素存于vector 中。
//练习 8.4
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
ifstream in("data"); //打开文件
//相当于检查in的状态
if (!in)
{
//cerr在iostream中定义
cerr << "无法打开输入文件" << endl;
return -1;
}
string line;
vector<string> words;
while (getline(in, line)) //从文件中读取一行
{
words.push_bac