2012-05-19 8 views
17

からのfstreamオブジェクトを作成fstreamオブジェクトを作成する周知の方法は次のとおりです。FILEの*ポインタ

ifstream fobj("myfile.txt"); 

すなわち。ファイル名を使用します。

しかし、ファイル記述子を使用してifstreamオブジェクトを作成したいとします。

理由:私は_popen()を使用してコマンドを実行します。_popen()は、出力をFILE*として返します。 FILE *ポインタは関係していますが、ファイル名はありません。

+1

@Joe:POSIXファイルディスクリプタがまだ別のものです。恐らく、C++のiostreamとC I/Oの両方がPosixプラットフォーム上で実装されていると思われます。しかし、iostreams *と* C I/Oの両方が標準ライブラリの一部であるため、現在の質問はより合理的です。 –

+0

これは、 'FILE *'で 'fileno'を使うことができれば、これはhttp://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file-descriptorの複製です。 'popen'から返されました – Alnitak

答えて

3

iostreamsとC I/Oは完全に別個のもので無関係なので、標準のC++だけではできません。あなたは自身の iostreamを書き込むことができますが、それはCファイルストリームによってバックアップされています。 GCCにはライブラリ拡張のようなストリームクラスが1つ付属していると思います。

また、Cファイルストリームをオブジェクト型の方法でラップする場合は、その目的でuse a unique pointerを使用できます。

+0

基本的には、_popen()の出力を単一の文字列に読み込みたいと思います。ちょっとした研究が私をfstreamに導いた。その文脈に何かを提案してください。 –

+1

@ahmedtabrez:いつものように 'std :: fread'を使うだけです。中間バッファを使用し、読み込んだバイトを結果文字列に追加します。または、それらのGCC拡張を調べてください。 –

+0

私たちはここで議論することができます:http://chat.stackoverflow.com/rooms/11467/room-for-ahmedtabrez-and-kerrek-sb –

-1

文字列を作成し、freadを使用してそれを読み取り、追加することができます。クリーンではありませんが、Cインターフェイスで作業しています。

このような何かが動作するはずです:

FILE * f = popen(...) 
const unsigned N=1024; 
string total; 
while (true) { 
    vector<char> buf[N]; 
    size_t read = fread((void *)&buf[0], 1, N, f); 
    if (read) { total.append(buf.begin(), buf.end()); } 
    if (read < N) { break; } 
} 
pclose(f);