2016-11-22 200 views
2

是否有可能使用C++(stl) 使用流從命名管道(mkfifo)讀取 - 因此不會事先爲讀取操作定義char *buffer[MAX_SIZE]使用istream從命名管道讀取

我想讀直到緩衝區結束並將結果放入std::string

(現在的方法:bytes = read(fd, buffer, sizeof(buffer));分配需要提前某種緩衝的。)

+0

固定它:-) 10X – Dani

回答

5

mkfifo的行爲很像普通的文件創建命名管道。因此,他們可以使用std::ifstreamstd::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打印到「世界,你好!」標準輸出。

+1

謝謝,我可以把它讀,直到緩衝區結束?如果有人在閱讀時填充緩衝區會發生什麼情況? – Dani

+1

@WhozCraig呃,失敗。修復。 –

+2

@Dani您可以像讀取任何其他流一樣閱讀它(請參閱[其他](http://stackoverflow.com/q/116038/1968))。如果你的程序正在運行,而其他進程正在填充它,程序將讀取,直到另一個進程關閉管道。 –

4

有什麼魔力管道到你的程序,它只是把你的cin閱讀從流而不是從控制檯用戶的輸入:Linux terminal pipe to my C++ program

在這個問題的編輯歷史中一個簡單的一瞥將表明,這個問題具有極大的從它的原始版本感謝提高到Konrad Rudolph(其他回答者在這個問題上)在進一步dastardliness的舉動我要湊他的解決方案2啜流進string

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'。在研究你的評論之後,我顯然不像我想象的那麼聰明:( –