是否有可能使用C++(stl) 使用流從命名管道(mkfifo)讀取 - 因此不會事先爲讀取操作定義char *buffer[MAX_SIZE]
?使用istream從命名管道讀取
我想讀直到緩衝區結束並將結果放入std::string
。
(現在的方法:bytes = read(fd, buffer, sizeof(buffer));
分配需要提前某種緩衝的。)
是否有可能使用C++(stl) 使用流從命名管道(mkfifo)讀取 - 因此不會事先爲讀取操作定義char *buffer[MAX_SIZE]
?使用istream從命名管道讀取
我想讀直到緩衝區結束並將結果放入std::string
。
(現在的方法:bytes = read(fd, buffer, sizeof(buffer));
分配需要提前某種緩衝的。)
與mkfifo
的行爲很像普通的文件創建命名管道。因此,他們可以使用std::ifstream
和std::ofstream
訪問:
#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';
}
運行:
mkfifo foobar
./main foobar
和其他地方:
echo 'Hello world!' > foobar
...這將導致./main
打印到「世界,你好!」標準輸出。
謝謝,我可以把它讀,直到緩衝區結束?如果有人在閱讀時填充緩衝區會發生什麼情況? – Dani
@WhozCraig呃,失敗。修復。 –
@Dani您可以像讀取任何其他流一樣閱讀它(請參閱[其他](http://stackoverflow.com/q/116038/1968))。如果你的程序正在運行,而其他進程正在填充它,程序將讀取,直到另一個進程關閉管道。 –
有什麼魔力管道到你的程序,它只是把你的cin
閱讀從流而不是從控制檯用戶的輸入:Linux terminal pipe to my C++ program
在這個問題的編輯歷史中一個簡單的一瞥將表明,這個問題具有極大的從它的原始版本感謝提高到Konrad Rudolph(其他回答者在這個問題上)在進一步dastardliness的舉動我要湊他的解決方案2啜流進string
:
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'。在研究你的評論之後,我顯然不像我想象的那麼聰明:( –
固定它:-) 10X – Dani