《C++Primer》第8章 IO类 笔记

1、几种标准库IO类型

《C++Primer》第8章 IO类 笔记_第1张图片
几种类型间的继承关系,如下图:
《C++Primer》第8章 IO类 笔记_第2张图片
在这里插入图片描述

2、IO类型无拷贝和赋值

这也是为什么这种类型作为函数返回值时,返回的是引用。

3、IO类的条件状态

条件状态是指:一组标志和函数,可以告诉我们指定的 (IO) 流是否可用,也就是我们刚刚的输入合不合法,这组标志和函数可被任何IO类使用。

下面的表列出了所有的条件状态(标志和函数)。
其中 “strm” 代指所有的IO类。

  • 置位:强制置1
  • 复位:强制置0

《C++Primer》第8章 IO类 笔记_第3张图片
当输入出现错误时,我们可以用上面的函数和标志位检查出来,如下面例子所示:

cout << "输入整数,注意,是整数哦!!" << endl;
int i = 10;
cin >> i;

if (cin.eof())
{
	cout << "eof turns 1!" << endl;
}

if (cin.fail())
{
	cout << "fail turns 1!" << endl;
}

if (cin.bad())
{
	cout << "bad turns 1!" << endl;
}

if (cin.good())
{
	cout << "good turns 1!" << endl;
}
else
{
	cout << "good turns 0!" << endl;
}

几种不同的输入:
《C++Primer》第8章 IO类 笔记_第4张图片

在这里插入图片描述
《C++Primer》第8章 IO类 笔记_第5张图片
因为i是整形,而我们输入了一个字符,所以cin会进入错误状态,failbit标志位被置1。
一个流一旦发生错误,这个流的后续IO操作都会失效。

badbit标志位

badbit标识系统级错误,如不可恢复的读写错误。通常情况,badbit被置1,流就无法使用了。

failbit标志位

failbit标志位置1,表示发生了可恢复错误,如期望读取整形,却读到了字符。

eofbit标志位

如果流读取的是文件,则到达文件结束位置,eofbitfailbit都会置1。

goodbit标志位

正常情况goodbit是0,表示没发生错误。

4、管理流的条件状态

4.1 rdstate()

流对象的rdstate()成员返回一个iostate值,对应流的当前状态,如下例所示:

cout << "输入整数,注意,是整数哦!!" << endl;
int i = 10;
cin >> i;
cout << cin.rdstate() << endl;

几种输入输出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以通过返回的的iostate判断错误类型。

4.2 clear()

clear成员是一个重载的成员,他有一个不接受参数的版本,接收参数的版本接受一个iostate类型的参数,能够把对应的标志位复位(置0)。没有参数的,是把所有错误标志位置0。

5、管理输出缓冲

缓冲刷新:指积累在缓冲区中的数据被真正写到输出设备或文件。

以下几种情况,发生缓冲刷新:

  • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
  • 缓冲区满了
  • endl操作符,显示刷新缓冲区
  • 在每个输出操作之后,我们可以用操纵符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
  • 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cincerr都关联到cout。因此,读cin或写cerr都会导致cout的缓冲区被刷新。
    在这里插入图片描述
    《C++Primer》第8章 IO类 笔记_第6张图片
    《C++Primer》第8章 IO类 笔记_第7张图片

6、文件读写

类 关联 文件,然后对其进行读、写。
《C++Primer》第8章 IO类 笔记_第8张图片
在这里插入图片描述

7、文件模式

《C++Primer》第8章 IO类 笔记_第9张图片

截断文件:这里的截断是指删除掉文件中的所有内容。
默认情况下以out模式打开的文件都是截断(trunc模式)的。

《C++Primer》第8章 IO类 笔记_第10张图片

你可能感兴趣的:(学习,c++)