2017-12-23 7 views
-1

文書には、FILEがストリームを識別するオブジェクト型であると記載されています。だから、FILEに関連付けられたストリームオブジェクトを取得することは可能ですか?FILEによって識別されるストリームオブジェクトを取得する方法は?

例えば、私はより一般的に私はこのような、何かを与えられたストリームをリダイレクトし、それにカスタムstreambufを設定する関数を書きたいなどstderrからstdoutFILEポインタ、またはstd::cerrからstd::coutオブジェクトを取得したいのですが:双方PARAMので、2つのパラメータを持っていると思われる冗長

redirect(stdout, std::cout); 
redirect(stderr, std::cerr); 

ストリームをリダイレクトする

void redirect(FILE* file, std::ios stream) { 
    freopen_s((FILE**)file, "CONOUT$", "w", file); 
    stream.rdbuf(customBuffer); 
} 

を使用エータは常に互いに関連しています。

+1

最初にファイルストリームを使用してみませんか? –

+0

標準のストリームをリダイレクトできるように、私の関数をstd :: fstreamだけでなくすべてのI/Oストリームで操作したいと考えています。 – krsi

答えて

0

C++でこれをきれいに行うことはできませんが、このようなことを行うことができます。

FILE * file = popen("someFile") 
const unsigned BUFF = 2048; 
string total; 
bool done = false; 
while (!done) { 
    vector<char> cBuf[BUFF]; 
    size_t read = fread((void *)&cBuf[0], 1, BUFF, f); 
    if (read) 
    { 
     total.append(cBuf.begin(), cBuf.end()); 
    } 
    if (read < BUFF) 
    { 
     done = true; 
    } 
} 
pclose(f); 
istringstream filey(total); 

希望します。

5

C++標準ライブラリには、C標準ライブラリが含まれています。 A FILEはCストリームです。これはC++のiostreamとはまったく違ったものです。 std::streamの実装では、基礎となるFILEに頼ることは可能ですが、これは標準では必須ではなく、その場合でもそれを取得する方法はありません。

可能であれば、FILE *を明示的に使用するカスタムstd::streambufを作成し、std::streamに使用することが可能です。 std::basic_streambufは、カスタム導出の基本クラスとして明示的に設計されたC++標準ライブラリの数少ないクラスの1つです。残念ながら、私はそれのためのチュートリアルを見つけることができませんでしたが、クラスには、オーバーライドする必要があるいくつかの仮想メソッドが含まれています。それはまさに簡単な道ではありませんが、いくつかの作品、重いテストでは可能です。しかし、完全な実装はSOの答えをはるかに超えています。

TL/DR:FILEていますが、根本的なFILE *を使用するカスタムstream_bufferを構築することができ、いくつかの仕事に関連した基礎となるstd::streamはありません。それらはむしろ高度な操作です...

関連する問題