:
今
int flags = fcntl(0, F_GETFL, 0);
fcntl(0, F_SETFL, flags | O_NONBLOCK);
を利用可能な入力がありません場合は、基礎となるread()
システムコールは0を返し、 std::cin
はこれがファイルの最後であると考えて、eof()
をstd::cin
に設定します。
標準入力から再度読み込みたい場合は、ストリームの状態をclear()
にします。
ここで唯一複雑な要因は、実際のファイル終了条件をstd::cin
で検出することが困難になることです。標準入力が対話型端末である場合にはあまり問題はありません。標準入力がファイルである場合、これは問題になるでしょう。その場合
、あなたの唯一の現実的な選択肢はread()
そして、それを読むために何かがあるときを決定するために、select()
それを、完全にstd::cin
を見送るファイルディスクリプタ0で非ブロックモードを入れ、poll()
かすることです。
ことは、明らかに、あらゆる種類のを先取りしまうので、あなたは、すでにstd::cin
年代streambuf
にバッファリング何があるかどう明示的に確認する必要がありますので、あなたも、これは複雑に取得する予定です、std::cin
でpoll()
またはselect()
を使用することができますが、 poll()
またはselect()
チェック。 std::cin
から何かを読み込もうとすると、まだバッファリングされたデータを読み込み、次に非ブロックモードになっているファイルディスクリプタからread()
にしようとすると、ファイルの偽の状態になります。
要約すると、ファイルストリームとストリームバッファーがどのように機能するかを読んで理解しておく必要があります。ファイル記述子が実際にどのように動作するか、ノンブロッキングモードがどのように機能するか、正しいロジックを理解するためには、使用する必要があります。あなたはstd::cin
と非ブロックのルートを行くことを主張し、getline()
場合
ああ、そして、あなたはgetline()
が実際に標準入力から改行を読み込むためgetline()
によって返された文字列が終了したかどうかを判断する簡単な方法を持っていない、またはそれになりますファイル条件の時期尚早の偽の終わりに達し、入力の行全体が実際に読み取られたわけではありません。
したがって、ノンブロッキングモードの場合、std::cin
は、getline()
の代わりにread()
を使用する必要があります。
質問に答えるには:はい、可能です。少なくともLinuxでは。 –
私はUbuntuを使っています。どうしたのですか?あなたは私にいくつかのリンクを与えたり、私に説明したりできますか? – Darius
短い答えは:1) 'getline'ではなく、低レベルのI/Oを使います。 2) 'select'を使います。 –