C++笔记:关于输入和输出

文章目录

使用标准库进行控制台输入输出时,有一些需要知道的内容。

更新缓冲区

使用 C++ 进行控制台输出时,系统将先把内容输出到缓冲区,然后再显示到屏幕或输出到其它输出流的目的地上。为了保证获取输出结果,必须注意更新缓冲区。

导致缓冲区内容被刷新的几种情况

1、程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区。

2、缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。

3、用操作符显式地刷新缓冲区,例如行结束符endl和flush。

4、在每次输出操作执行完后,用unitbuf操作符设置流的内部状态,从而清空缓冲区。

5、可将输出流与输入流关联起来。在这种情况下,在读输入流时,将刷新其关联的输出缓冲区。

此外还应注意,如果程序不正常结束,输出缓冲区将不会刷新。调试程序时,必须保证期待写入的每个输出都确实被刷新了。最好的方法是保证所有的输出操作都显式地调用了flush或endl。

下面的程序输出一些值并关注其缓冲区的状态。

#include <iostream>
 
int main()
{
	// 使用 std::endl 显式地更新缓冲区。
	std::cout << "Hello, world!" << std::endl;
	std::cout << "Hi, My Child!";
	// 使用 std::flush 显式地更新缓冲区。
	std::flush(std::cout);
	std::cout << "Run Finished.";
	// 使用 return 0 自动更新缓冲区。
	return 0;
}

由于以后程序可能会越来越长,为了简便起见,我开始使用 using namespace 语法。上述代码可以简单写为如下。

#include <iostream>
 
using namespace std;
 
int main()
{
	// 使用 std::endl 显式地更新缓冲区。
	cout << "Hello, world!" << endl;
	cout << "Hi, My Child!";
	// 使用 std::flush 显式地更新缓冲区。
	flush(cout);
	cout << "Run Finished.";
	// 使用 return 0 自动更新缓冲区。
	return 0;
}

这样代码就变得更为简洁。

读入未知数量的输入

先看下面的代码:

/* C++ 求和程序
 * By Ceeji
 */
#include using namespace std;

int main()
{
	int value, p = 0;
	while (cin >> value)
	{
		p += value;
	}
	cout << p;
	return 0;
}

这段代码能够实现任意多个整数的求和。我们看到其中采用了这样的语法。

while (cin » value)

我们知道,输入操作符返回的是 cin 本身。那么,对 cin 使用 while 循环判断意味着什么呢?答案就是,如果流是有效的(接受下一个输入是可能的),就为 true,否则为 false。

从键盘输入文件结束符

怎样才能使流无效?如果文件结束,当然就无效了。所以,关键是输入文件结束符。

  • 在 Linux/Unix 中,输入 Ctrl + D。
  • 在 Windows/Dos 中,输入 Ctrl + Z。
当前页阅读量为: