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。
© 轉載需附帶本文連結,依 CC BY-NC-SA 4.0 釋出。