aihot  2020-11-12 09:24:27  OpenCV |   查看评论   
这种情况下你所键入的字符块被收集并存储在一个被称为缓冲区的临时存储区域中。按下回车键可使你输入的字符段对程序起作用。

缓冲输入一般常用在文本程序内,当你输入有错误时,就可以使用你的键盘更正修正错误。当最终按下回车键时,你就可以发送正确的输入。

而在一些交互性的游戏里需要非缓冲输入,如:游戏里你按下一个键时就要执行某个命令。

缓冲分为两类:

1)完全缓冲:缓冲区被充满时被清空(内容发送到其目的地)。这种类型的缓冲通常出现在文件输入中。

2)行缓冲:遇到一个换行字符时被清空缓冲区。键盘的输入是标准的行缓冲,因此按下回车键将清空缓冲区。

5.2 输出缓冲

上面讲的是输入的缓冲,而C++中的输出也是存在缓冲的。

每个输出流都管理一个缓冲区,用来保存程序读写的数据。例如,如果执行下面的代码

os<<”please enter a value:”;

文本串可能立即打印出来,但也有可能被操作系统保存在缓冲区中,随后再打印。有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。

导致缓冲刷新(即,数据真正写到输出设备或文件)的原因有很多:

<1> 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。

<2> 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区。

<3> 我们可以使用操纵符endl来显式刷新缓冲区。

<4> 在每个输出之后,我们可以用操纵符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。

<5> 一个输出流被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新,cin和cerr都关联到cout。因此读cin或写cerr会导致cout的缓冲区被刷新。

除了endl可以完成换行并刷新缓冲区外,IO库中还有两个类似的操纵符:flush和ends。flush刷新缓冲区,但不输出,任何额外的字符;ends向缓冲区插入一个空字符,然后刷新缓冲区。

cout << "hi!" << endl; // 输出 hi 和一个换行符,然后刷新缓冲区 
cout << "hi!" << flush; // 输出hi,然后刷新缓冲区,不附加任何额外字符 
cout << "hi!" << ends; // 输出hi和一个空字符。然后刷新缓冲区

如果想每次输出操作后都刷新缓冲区,我们可以使用unitbuf操纵符。它告诉流在接下来的每次写操作后都进行一次flush操作。而nounitbuf操作符则重置流使其恢复使用正常的系统管理的缓冲区刷新机制。

cout << unitbuf; // 所有输出操作后都立即刷新缓冲区  // 任何输出都立即刷新,无缓冲 
cout << nounitbuf; // 回到正常的缓冲方式

注意:如要程序异常终止,输出缓冲区是不会被刷新的。当一个程序崩溃后,它所输出的数据很可能停留在输出缓冲区中等待打印。

我们可以将一个istream流关联到另一个ostream,也可以将一个ostream流关联到另一个ostream。

cin.tie(&cout); // 标准库已经将cin与cout关联在一起  // s.tie如果s关联到一个输出流,则返回指向这个流的指针,如果对象未关联到流,则返回空指针 
ostream *old_tie = cin.tie(nullptr); // 将cin不再与其他流关联,同时old_tie指向cout 
cin.tie(&cerr);  // 读取cin会刷新cerr而不是cout 
cin.tie(old_tie);  // 重建cin和cout的正常关联 

6,使用文件流

6.1 使用文件流对象

创建一个文件流对象时,我们可以提供文件名,也可不提供文件名,后面用open成员函数来打开文件。

string infile="../input.txt";  string outfile = "../output.txt";  ifstream in(infile); // 定义时打开文件 
ofstream out;  out.open(outfile); // 用open打开文件

如果调用open失败,failbit会被置位,所以调用open时进行检测通常是一个好习惯。

如果用一个读文件流ifstream去打开一个不存在的文件,将导致读取失败,而如果用一写文件流ofstream去打开一个文件,如果文件不存在,则会创建这个文件。

一旦一个文件流已经被打开,它就保持与对应文件的关联。实际上,对一个已经打开的文件流调用open会失败,并会导致failbit被置位,随后的试图使用文件流的操作都会失败。为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件。关闭一个流的关联文件可以用close成员函数来完成。

6.2 文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件,下面列出了文件模式和它们的含义:

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自C++的那些事:流与IO类

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]