2016-11-22 10 views
0

私のコンピュータ上のファイルをデバッグしています。キーボード入力を使用するのではなく、私はそうのようなプログラムを実行しています:リダイレクトされたLinux標準入力でgetline()が機能しない

./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がありましたが、毎回を使用しました。リダイレクトせずに値を入力すると正常に動作します。

これが出力されます。

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

私は必要があります。! – theEpsilon

+0

myStringは文字列か文字配列ですか? – Eugene

+0

@Eugeneこれは、C++標準ライブラリの文字列です。 'throwAwayString'私は前のコメントで試しました – theEpsilon

答えて

4

わかりました。 Basile Starynkevitchが提案したように、問題は自分のコードではなく、入力ファイルにありました。私は自分のWindowsラップトップに入力ファイルを書き込んでLinux VMから実行しましたが、エラーの原因となったDOS行の終了に関する混乱がありました。

Windowsが\r\nで自分のラインを終了し、* NIXだけで\nでそれらを終了しているため、cin.ignore()getline()に読み込まれていた\rではなく\nを、無視しました。

ソリューション:単にView -> Line Endings -> Unix)のような通常のもの(Linuxの場合、入力ファイルを書き込み、またはお好みのエディタで「UNIX」行末を使用

呪いあなたが「標準」の開発者を非難

+1

エディタ(Notepad ++があります)によっては、行末を設定することができます。 –

+0

@Peterが回答に組み込まれました – theEpsilon

-1

代わりにcinコマンドを使用してください。たとえば:あなたは、ユーザーが1つの単語だけ("STOP")を入力することになっているとき、行全体を格納する必要がないので

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

これは、getline()機能の必要性を排除するであろう。このような状況でユーザーが複数の単語を入力しても、コンパイラは最初の単語のみを取ります。

+0

'cin'はデータの行を取る必要があるので動作しません。私はプログラム内の行を使用しています。 'getline()'が必要です – theEpsilon

関連する問題