2010-07-01 69 views
1

的我使用以下代碼:cin.get()不失控環

#include <stdio.h> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    char c ; 
    c = cin.get() ; 
    do { 
     cout.put(c) ; 

     c = cin.get() ; 
    } while (!cin.eof()) ; 

    cout << "coming out!" << endl; 
    return 0; 
} 

問題的上面的代碼,其不失控循環,這意味着其不打印的「出山」。任何人都可以幫助它爲什麼如此?我在mac和linux上測試這個程序。

感謝

回答

2

除非您按下Ctrl + Z,否則標準中不會出現EOF。

因此,cin.eof()總是錯誤的。

要修復它,請按Ctrl + Z發送一個文件結束符。
或者,您可以更改條件。 (例如,while(c != '\n')

+0

儘管你的答案while(c!='\ n')在終端上工作,但是當我嘗試使用文件輸入時,它會卡住。不管怎麼說,多謝拉。 – itsaboutcode 2010-07-01 16:06:34

+0

添加'&&!cin.eof()'。 – SLaks 2010-07-01 16:08:34

+0

你是偉人! – itsaboutcode 2010-07-01 16:15:18

1

您需要按CTRL-Z來模擬EOF(結束文件),並退出循環。

如果您不按CTRL-Z,循環將繼續運行。

+0

或在非Microsoft平臺上的CTRL-D。 – sepp2k 2010-07-01 15:56:37

5

它打印「出來」,只要它獲得文件結束。它會走出循環的,如果你重定向文件以將其與

./program < file 

或發送檔案結尾自己,按Ctrl + d(Linux)或CTRL + Z(DOS)

+0

那麼如果我使用下面的命令來運行它,它就會出來。 ./main < input.txt > output.txt。但是,無論如何,如果我可以在命令提示符上進行輸入嗎?謝謝 – itsaboutcode 2010-07-01 15:57:30

+0

如果我按ctrl + d(linux),它不會打印「出來」 – itsaboutcode 2010-07-01 16:00:43

+0

正如其他人提到的(對於dos/windows)和我剛剛添加的,您可以隨時告訴程序何時結束向其發送信息 – 2010-07-01 16:01:00

1

這裏工作得非常好:)如果您在終端中運行此功能,您必須將EOF發送到此終端。在* nix上這將是Control + D。我不能說Windows的任何問題。

編輯:正如其他人指出的:Ctrl + Z將是Windows發送EOF的方式。

0

我要對意圖進行猜測,因爲該代碼沒有問題,但它可能不是您想要的,並且還會提示一個while循環uhhh ..而我在這裏。

#include <stdio.h> 
#include <iostream> 
using namespace std; 

bool is_terminator(char ch) 
{ 
    return ch != '\n' && ch != '\r'; 
} 

int main() 
{ 
    char ch; 
    while (cin.get(ch) && !is_terminator(ch)) 
     cout.put(ch); 

    cout << "coming out!" << endl; 
}