ストリームを使用してC++(stl)を使用して名前付きパイプ(mkfifo)から読み込むことはできますか?istreamを使用して名前付きパイプから読み取る
バッファが終わるまで読み込み、結果をstd::string
に入れたいと思います。
(現在の方法:bytes = read(fd, buffer, sizeof(buffer));
は、事前にバッファのいくつかの種類の割り当てが必要です。)通常のファイルのようなmkfifo
振る舞いで作成
ストリームを使用してC++(stl)を使用して名前付きパイプ(mkfifo)から読み込むことはできますか?istreamを使用して名前付きパイプから読み取る
バッファが終わるまで読み込み、結果をstd::string
に入れたいと思います。
(現在の方法:bytes = read(fd, buffer, sizeof(buffer));
は、事前にバッファのいくつかの種類の割り当てが必要です。)通常のファイルのようなmkfifo
振る舞いで作成
名前付きパイプを。したがって、彼らはstd::ifstream
とstd::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
を印刷するには、「こんにちは、世界!」標準出力。あなたのプログラムへの配管についての魔法のようなものは何もありません
おかげで:-)それを修正し、私はバッファが終わるまでそれを読むことができますか?私が読んでいる間に誰かがバッファをいっぱいにしたらどうなりますか? – Dani
@WhozCraig Uh、失敗します。修正しました。 –
@Dani他のストリームと同様に読むことができます([他の場所](http://stackoverflow.com/q/116038/1968)参照)。他のプロセスがパイプを満たしている間にプログラムが実行されている場合、他のプロセスがパイプを閉じるまで、プログラムは読み込みます。 –
それはちょうどあなたがcin
ではなく、コンソールからユーザーの入力ストリームからの読み込みになります:Linux terminal pipe to my C++ program
この質問の編集履歴でシンプルな一目でこの質問を大幅に持っていることが表示されます(。この質問に他の回答)Konrad Rudolphへのオリジナルバージョンのおかげで改善され、さらにdastardlinessの動きでは、私がstring
にストリームをズルズルための彼のソリューションの2をこすりするつもりです:
const string mkfifo{ istreambuf_iterator<char>(cin), istreambuf_iterator<char>() };
istringstream temp;
temp << cin.rdbuf();
const auto mkfifo = temp.str();
。このコードを使用するには、コンパイルされたプログラムは、あなたがこのようなことへのパイプmain
うという名前であることを言う:
mkfifo named_pipe
echo "lorem ipsum" > named_pipe
./main named_pipe
これは、 'EOF'が間違った型(' int')であるため、 '' getline'呼び出しのためのマッチング関数がありません。 –
あなたの編集について:パイプに 'static_cast
@KonradRudolphうわー、私はいつも 'EOF'を使っていました。あなたのコメントを調査した後、私は思ったほど明確に賢明ではありません:( –
は10倍 – Dani