2014-10-29 142 views
1

我編寫了一個程序,用於從控制檯讀取輸入並在控制檯上寫入agian。所以我用下面的代碼。由於cout << cin.rdbuf()導致的無限循環,爲什麼?

#include<iostream> 
int main() 
{ 
    using namespace std; 
    cout<<cin.rdbuf(); 
    cin.get(); 
    return 0; 
} 

但它進入無限循環。始終獲得輸入並將其打印回來。任何人都可以解釋,這裏發生了什麼?

它產生以下輸出:

(等待輸入:輸入克)

g 
g 

(再次等待輸入:輸入H(任何炭))

h 
h 

(靜止等待輸入:輸入h(任意字符))

h 
h 

等,程序總是等待輸入,當我輸入任何charecter它只是打印它。再等待輸入。它不會終止

+1

你期望的行爲是什麼? – 2014-10-29 13:45:39

+0

你怎麼知道有無限循環?它是否輸出「無限循環」? :| – Nawaz 2014-10-29 13:54:48

+0

http:// ideone。com/UpFsFS它肯定會產生輸出 - 在本地運行它會重複整行 – Baldrickk 2014-10-29 14:20:22

回答

1

有趣的行爲。 隨着你的線cout<<cin.rdbuf();您呼叫:ostream& operator<< (streambuf* sb);

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/

(2)流緩衝 檢索從由某人指出(如果有的話)流緩存對象控制的輸入序列儘可能多的字符可能並將它們插入流中,直到輸入序列耗盡或函數無法插入流中。 該函數在內部通過首先構造一個哨兵對象來訪問輸出序列。然後(如果好的話),它將字符插入到其關聯的流緩衝區對象中,就像調用其成員函數sputc一樣,並最終在返回之前銷燬該哨兵對象。

我在內部假設這個函數在循環的streambuffer中調用某種getString。這個可能會等待關鍵輸入並將它們轉發到ostream。流緩衝區永遠不會空,但會等待用戶輸入。

要得到確切答案,請閱讀< <運算符的實現。

+0

你不需要閱讀實現;根據規範,這或多或少是顯而易見的。 – 2014-10-29 14:47:35

+0

是的。但我不確定「在輸入序列耗盡之前」是什麼意思。 – Steffen 2014-10-29 14:57:35

+0

直到沒有可用的輸入。文件結尾。 – 2014-10-29 15:04:32

1

您確定您正在生成標準 中的文件末尾嗎? std::streambuf*上的<<的定義是讀取 ,直到streambuf上的文件結束。基本上,它是東西 沿着線:

while (sb->sgetc() != EOF) { 
    this->rdbuf()->sputc(sb->sbumpc()); 
} 

這是簡化的;根據實際發生的情況,一個實際的實現必須在sputc上執行 錯誤檢查,並在 目標中設置iostate位。 但這是一個基本的抽象。並且出於優化原因, 真正的實現可能使用sgetn而不是sgetc/sbumpc

相關問題