2016-07-18 22 views
0

私は、後で使用するために保存したいキーボードからの入力を(C++で)取得しようとしています。これはちょうど、私が働いているコードの簡易版であるが、それは同じ動作を再現:getline(...)が画面に表示されるのはなぜですか?

#include <iostream> 

int main(int argc, char * * argv) 
{ 
    std::string line; 

    std::cout << "> "; 
    std::getline(std::cin, line); 

    return 0; 
} 

getlineは正しく標準入力からの入力を読み込みますが、入力は、新しい行に直後に印刷されます。また、>文字の後の空白は、入力を読み込んだときに無視されますが、後に出力されます。次のようなものがあります。

>hi 
> hi 

どうしてですか?どうすればそれを避けることができますか?

私はWindows 10で、CLion 2016.1を使用しています(これはCLionのコンソールで行われます)。

+0

どのコンパイラを使用していますか?あなたはコンパイラからコードを実行していますか? – NathanOliver

+0

出力を表示するには、出力をフラッシュする必要があります。そうでなければ、印刷時間は実装定義です。 –

+0

[できません](http://coliru.stacked-crooked.com/a/9c803cd4281ed0c9)[再現](http://ideone.com/7XV0UM)[this](http://imgur.com/AvAyaUB)[行動](http://imgur.com/2BjuFCc)。 –

答えて

2

Clionは、組み込みのコンソールで実行される場合は実行しますが、Windowsコンソールで実行する場合は実行しないでください。

どうすればよいですか?

これを実行する最も簡単な方法は、デバッグモードで実行することです。

1

どうしてですか?

おそらく出力のバッファリングが原因です。

どうすればよいですか?印刷すべきかを持つことにより

std::cout << "> " << std::flush;代わりのstd::cout << "> ";を使用してgetline()を呼び出す前に印刷すること。

+1

標準出力をここでフラッシュする必要はありません。 'std :: cin'から読み込むと標準出力がフラッシュされ、入力を待つ前にプロンプ​​トが表示されます。 –

0

なぜstd :: cinを使用しないのですか?おそらくあなたのプラットフォームのために、奇妙な動作が起こります。

std::coutの後にgetline()という機能があります。 getlineの動作のいくつかは、使用しているコンパイラによって多少異なる定義があります。あなたの行動を再現できない人もいるかもしれません。

従来のキーボードI/Oの伝統的なC++スタイルでは、多くの人がほとんどの入力または出力の後にstd::endlを呼び出します。 endlに標準バッファをフラッシュするためにflush()への自動呼び出しがあります。ただし、getline()関数はC言語のホールドオーバーです。 Cでは、探している出力を得るためにコマンドflush()を繰り返し使用する必要があります。これは、Cスタイル出力またはC++スタイル出力のいずれかにできるだけスティックする方が良い理由の1つです。

なぜstd::cinを使用できないのですか?あなたはendlでそれをフォローすることができ、それ以降はすべてがうまく動作するはずです。

また、裸のendlまたはflush()を呼び出して、定義された動作の土地に戻すことができます。

getline()が具体的に必要な理由はありますか?

関連する問題