當我們使用一個istream對象作為條件時,其效果是檢測流的狀態。如果流是有效的,即流未遇到錯誤,那么檢測成功。當遇到文件結束符,或遇到一個無效輸入時(例如需要將輸入讀到一個int變量中,但實際從鍵盤輸入的是字符),istream對象的狀態會變成無效。處於無效的istream對象會是條件變為假。
當從鍵盤向程序輸入數據時,對於如何指出文件結束符,不同的操作系統有不同的實現。在Windows平台中,輸入文件結束符的方法是:按Ctrl+z,然后按Enter。在Unix或Linux下是按Ctrl+d,無需Enter,當然,由於當你輸入Ctrl+d后,它仍然停留在系統的輸入緩沖區中,所以你還是需要使用一個Enter使其生效。下面是幾個關於該用法的示例:
#include <iostream>
#include <string>
using namespace std;
/*
測試標准輸入cin和文件結束符
測試平台:Windows
*/
int test_string_one();
int test_string_two();
int test_string_three();
int main()
{
//test_string_one();
test_string_two();
}
int test_string_one() //第一個程序:輸入的是整數
{
int num;
while(cin>>num)
cout << num << " ";
return 0;
}
/*
輸入:1 2 3 4 5 Ctrl+d Enter
輸出:1 2 3 4 5
此處之所以循環停止,是因為遇到一個無效輸入(Ctrl+d),而不是遇到了文件結束符。
因為在windows平台,結束符是Ctrl+z,然后按Enter。
例如輸入:1 2 3 4 5 a Enter
輸出仍是:1 2 3 4 5
當然如果該測試用例用於Linux下,那么由於系統的結束符是Ctrl+d,所以雖然輸出一樣,
但是之所以循環停止,是因為到達了文件結束,而不是得到了一個無效輸入。
*/
int test_string_two() //第二個程序:輸入的是字符串
{
string word;
while(cin>>word)
cout << word << " ";
return 0;
}
/*
輸入:hello world Ctrl+z 回車
輸出:hello world
此處之所以循環停止,是因為遇到一個文件結束符。
因為在windows平台,結束符是Ctrl+z,然后按Enter。
*/