2016-11-22 78 views
0

我正在調試計算機上的文件。除了使用鍵盤輸入,我運行該程序,如下所示:getline()無法在重定向的Linux標準輸入上工作

./main < input.txt 

還有就是在我的程序代碼段,看起來像這樣:

do { 
    cout << "Type \"STOP\" when done: "; 
    getline(cin, myString); 
    cout << endl; 
    if (myString == "STOP") { 
     break; 
    } 
    cout << "Input next line: " << endl; 
    getline(cin, myString2); 
    cout << endl; 

    // do something with the two strings 

} while (myString != "STOP"); 

而不是停止時,有一個線在等於"STOP"(不含引號)的文件中,它始終保持循環。此前,有一個cin >> myInt,但我確保在每次通話後使用cin.ignore()。它工作正常,如果我輸入的值沒有重定向。

這是輸出:

Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
... 

請幫我弄清楚是怎麼回事!

+0

我應該!補充說我也嘗試過'getline(cin,throwAwayString)'而不是'cin.ignore()'無濟於事 – theEpsilon

+0

是myString是字符串還是char數組? – Eugene

+0

@Eugene它是C++標準庫中的一個字符串,與'throwAwayString'我在前面的評論中試過 – theEpsilon

回答

4

好吧,我想通了!就像Basile Starynkevitch建議的那樣,問題不在於我的代碼,而在於輸入文件。我在我的Windows筆記本電腦上編寫了輸入文件,並從Linux VM中運行了它,並且對導致錯誤的DOS行結尾存在一些混淆。

由於Windows終止他們與\r\n線和* nix終止他們只是\n,該cin.ignore()忽略了\r但不是\n,這是被讀入getline()

解決方法:簡單的寫在Linux中輸入文件,或在您的選擇(通常是像View -> Line Endings -> Unix)的編輯器中使用的「UNIX」的行結束

詛咒你炮轟「標準」開發商

+1

一些編輯器(特別是Notepad ++)允許配置行尾。 –

+0

@Peter納入回答謝謝 – theEpsilon

-1

嘗試簡單地使用cin命令。例如:

do { 
    cout << "Type \"STOP\" when done: "; 
    cin >> myString; 
    cout << endl; 
    if (myString == "STOP") { 
     break; 
    } 
} while (myString != "STOP"); 

這將消除對getline()功能的需要,因爲你不需要存儲整個線的時候,用戶只應該鍵入一個單詞("STOP")。即使用戶在這種情況下輸入了多個單詞,編譯器也只會輸入第一個單詞。

+0

'cin'將不起作用,因爲我需要獲取數據,我正在使用這些程序中的數據。它需要'getline()' – theEpsilon

相關問題