2013-08-07 83 views
0

我是一個初學者,所以請小心,如果問題是關於某事顯而易見的。使用popen替代「寫入文件」,然後「使用ifstream從它讀取」C++

當前版本的代碼如下所示。 output.txt使用ifstream打開,然後輸入到Coll類型的對象中,因爲它理解「理解」生成的output.txt文件的格式,所以使用它。

std::system("./Pogram > output.txt"); 
Coll inputout; 
    ifstream ifsout("output.txt"); 
    ifsout >> inputout; 

我的目標是擺脫中間output.txt並做下圖所示。

FILE * f = popen("./Program", "r"); 
Coll inputout; 
f >> inputout; 

這將產生以下錯誤,但:

error: no match for ‘operator>>’ in ‘f >> inputout’ 

你可以提出任何補救措施是什麼?

+0

有點不尋常,但如果你真的想你的示例代碼來工作,那麼你*可能*實現'運營>>(FILE *,常量科爾&)' 。 –

回答

0

fFILE的類型,它沒有>>運算符。你需要使用諸如fread()fwrite()之類的東西。如果您要使用FILE,則您也不會獲得ifstream爲您提供的所有奇特類型轉換,您基本上必須直接讀取和寫入比特。

fread(&inputout, sizeof(Coll), 1, f); 

這是從當前文件位置讀取內存並將其放入變量inputout那是科爾X 1.

+0

只有在數據是二進制數據時纔有效,第一個示例代碼使用未在二進制文件讀取中使用的>> >>進行顯示。 –

1

你的問題的大小是popen只是提供了一個FILE *,和我不不相信有任何(便攜式,可靠的)方式將其轉換爲文件流。所以你將不得不使用fgets來讀取一行作爲C字符串和stringstream將其轉換爲您的類型,或使用fscanf或類似的。

+0

我認爲你是對的,但http://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file-descriptor可能會有所幫助,取決於提問者需要代碼的便攜性成爲。 –

+0

你總是可以創建自己的std :: streambuf來從FILE *中讀取......但這可能會過度殺傷 – rabensky

+0

是的,除非你真的需要做很多 - 在這種情況下創建'pipe'流將會更好選擇,我感覺。 –

0

可能這可能是與pstream工作:

#include <pstream.h> 
#include <string> 
#include <iterator> 

int main() 
{ 
    redi::ipstream proc("./Program"); 
    typedef std::istreambuf_iterator<char> it; 
    std::string output(it(proc.rdbuf()), it()); 

    Coll inputout; 
    output>>inputout; // You might have overloaded ">>" 
}