2012-03-20 56 views
1

我打開了一個管道以讀取文本輸入的程序。將文本發送到C++中的管道的正確方法

這就是我目前在做

FILE* p = popen("myprogram", "w"); 
string myBuff; 
//write something to myBuff 
fprintf(p, "%s\n", myBuff.c_str()); 

這就是我想要做的

p = popen("myprogram", "w"); 
p << "my text" << endl; 

升壓的確有東西要給這個?我會認爲這是一個經常遇到的問題,它通常如何解決?

+1

什麼是文件?我認爲GCC附帶一個包含C'FILE *'的流類型對象,這可能很有用,但它不是標準庫的一部分。 – 2012-03-20 20:32:34

+1

[stdio文件中的構造ofstream]的可能的重複(http://stackoverflow.com/questions/8073846/construct-ofstream-from-stdio-file) – 2012-03-20 20:32:45

+0

它爲什麼這是一個重複並不明顯。我的問題的解決方案可能是管道特定的;例如我正在研究使用Boost.Process – Mikhail 2012-03-20 20:43:42

回答

0

boost有促進進程間通信的進程間庫。他們還在他們的沙盒中作爲非官方圖書館使用標準管道來促進進程間通信。

4

一個快速和骯髒的解決方案,不會涉及Boost將簡單地過載operator<<FILE*類型。

FILE* operator<<(FILE* fptr, const std::string& input_string) 
{ 
    fprintf(fptr, "%s\n", input_string.c_str()); 
    return fptr; 
} 

這不會與流修飾符像std::endl等方面的工作,但如前所述,它得到一個快速和骯髒的方式來完成工作。 Boost本身沒有任何問題,但我認爲只是爲了獲得使用operator<<語法的能力,這有點沉重。

+0

這樣做是否有一些大規模的性能打擊?或者,這種性能與使用流的情況相同嗎? – Mikhail 2012-03-20 20:38:23

+1

爲什麼會有大規模的表現? C++流和用於I/O的libc函數都必須經歷相同的內核調用,因此最終兩個接口的性能應該非常相似。 – Jason 2012-03-20 20:39:42

相關問題