2016-11-22 5 views
2

ストリームを使用してC++(stl)を使用して名前付きパイプ(mkfifo)から読み込むことはできますか?istreamを使用して名前付きパイプから読み取る

バッファが終わるまで読み込み、結果をstd::stringに入れたいと思います。

(現在の方法:bytes = read(fd, buffer, sizeof(buffer));は、事前にバッファのいくつかの種類の割り当てが必要です。)通常のファイルのようなmkfifo振る舞いで作成

+0

は10倍 – Dani

答えて

5

名前付きパイプを。したがって、彼らはstd::ifstreamstd::ofstreamを使用してアクセスすることができます。他の場所で

mkfifo foobar 
./main foobar 

そして:

#include <fstream> 
#include <iostream> 

int main(int, char** argv) { 
    std::ifstream file{argv[1]}; 
    std::string line; 
    std::getline(file, line); 
    std::cout << line << '\n'; 
} 

実行

echo 'Hello world!' > foobar 

...これが原因となります./mainを印刷するには、「こんにちは、世界!」標準出力。あなたのプログラムへの配管についての魔法のようなものは何もありません

+1

おかげで:-)それを修正し、私はバッファが終わるまでそれを読むことができますか?私が読んでいる間に誰かがバッファをいっぱいにしたらどうなりますか? – Dani

+1

@WhozCraig Uh、失敗します。修正しました。 –

+2

@Dani他のストリームと同様に読むことができます([他の場所](http://stackoverflow.com/q/116038/1968)参照)。他のプロセスがパイプを満たしている間にプログラムが実行されている場合、他のプロセスがパイプを閉じるまで、プログラムは読み込みます。 –

4

それはちょうどあなたがcinではなく、コンソールからユーザーの入力ストリームからの読み込みになります:Linux terminal pipe to my C++ program

この質問の編集履歴でシンプルな一目でこの質問を大幅に持っていることが表示されます(。この質問に他の回答)Konrad Rudolphへのオリジナルバージョンのおかげで改善され、さらにdastardlinessの動きでは、私がstringにストリームをズルズルための彼のソリューションの2をこすりするつもりです:

istreambuf_iterator method:

あなたは、それぞれのポストにそれぞれ長所と短所について読むことができます
const string mkfifo{ istreambuf_iterator<char>(cin), istreambuf_iterator<char>() }; 

stringbuf copy method:

istringstream temp; 
temp << cin.rdbuf(); 
const auto mkfifo = temp.str(); 

。このコードを使用するには、コンパイルされたプログラムは、あなたがこのようなことへのパイプmainうという名前であることを言う:

mkfifo named_pipe 
echo "lorem ipsum" > named_pipe 
./main named_pipe 
+0

これは、 'EOF'が間違った型(' int')であるため、 '' getline'呼び出しのためのマッチング関数がありません。 –

+2

あなたの編集について:パイプに 'static_cast (EOF)'と書かれたものがある場合、何が起こるのでしょうか(本物の質問:何が起こるか、動作が保証されているかどうかはわかりませんが、ストリームが途中で切り詰められ、 'EOF'を' char'にキャストするのが一般的な解決策ではないと思います)。 –

+1

@KonradRudolphうわー、私はいつも 'EOF'を使っていました。あなたのコメントを調査した後、私は思ったほど明確に賢明ではありません:( –

関連する問題