0

私はC++コードに取り組んでおり、次のことをしたいです:

コードには新しい型 T があり、T で定義されたメソッドがあり、いくつかの情報を型 FILE* 変数に出力します。

プログラム内でこの文字列に対していくつかの作業を行いたいので、画面に出力されるものを含む型文字列 (または char*) の変数が必要です (印刷関数 stdout を次のように指定した場合)。ファイル*)。

これどうやってするの ?たぶん、いくつかの FILE* 変数を作成してから、作成した File* 変数に格納されている情報を含む string/char* 変数を (何らかの方法で) 作成できますか?

どんな助けでも大歓迎です!

4

2 に答える 2

4

POSIX 1.2008fmemopenでは、open_memstream関数FILE*はメモリに書き込む(および/またはメモリから読み取る)ポインタを作成します。

それがあなたのプラットフォームで機能しない場合(そしてそれにフックする他の方法がないFILE *場合)、あなたは運が悪いです。

次に試してみるのは、無名パイプ(POSIX pipe、Windows )を作成し、CreatePipeその書き込み側をFILE *(POSIX fdopen、および_open_osfhandleHANDLEからCRT fdを取得するためのWindows)にラップすることです。ここでは、パイプのバッファサイズが十分であることを確認するか、パイプ読み取るためのスレッドを生成する必要があります。メソッドが完了した後(またはバッファリングを無効にするために使用)fflush、書き込み側に忘れないでください。setbuf

于 2013-01-16T13:17:15.890 に答える
1

プラットフォームに依存しない方法がいくつかあります。stringstream(http://www.cplusplus.com/reference/sstream/stringstream/)C++ では、多くの<<演算子のオーバーロードを持つを使用できます。ostream&そのため、 (not ) への参照をoFstream出力メソッドに渡すと、ファイル、標準出力ストリーム、および文字列出力を簡単に切り替えることができます。これらのストリームはすべて ostream から継承されるためです。次に、必要に応じてstd::stringオブジェクトをstringstream取得し、そこから C 文字列を取得できます。

コード例:

出力関数 (またはメソッド。この例の 2 番目の引数は必要ありません):

void PrintMyObjectToSomeStream(std::ostream& stream, const MyClass& obj)
{
    stream << obj.pubField1;
    stream << obj.pubField2;
    stream << obj.GetPrivField1();
    stream << "string literal";
    stream << obj.GetPrivField2();
}

使用法:

MyClass obj1;
std::ofsstream ofs;
std::stringstream sstr;
//...open file for ofs, check if it is opened and so on...
//...use obj1, fill it's member fields with actual information...
PrintMyObjectToSomeStream(obj1,std::cout);//print to console
PrintMyObjectToSomeStream(obj1,sstr);//print to stringstream
PrintMyObjectToSomeStream(obj1,ofs);//print to file

std::string str1=sstr.str();//get std::string from stringstream
char* sptr1=sstr.str().c_str();//get pointer to C-string from stringstream

または、オーバーロードできますoperator<<

std::ostream& operator<<(std::ostream& stream, const MyClass& obj)
{
    stream << obj1.pubField;
    //...and so on
    return stream;
}

次に、次のように使用できます。

MyClass obj2;
int foo=100500;
std::stringstream sstr2;
std::ofstream ofs;//don't forget to open it

//print to stringstream
sstr2 << obj2 << foo << "string lineral followed by int\n";
//here you can get std::string or char* as like as in previous example

//print to file in the same way
ofs << obj2 << foo << "string lineral followed by int\n";

使用はC++よりもCですが、アントンの答えFILEを切り替える方法や使用する方法を考えることができますfpirntfsprintf

于 2013-01-16T13:20:17.917 に答える