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。
当前页阅读量为: