3

std::stringbuf のpubsetbufメンバーが Visual Studio 2010 でまったく機能しません!

コード:

char *FileData = ... ;
unsigned long long FileDataLen = ... ;
std::stringstream *SS = new std::stringstream(std::stringstream::in | std::stringstream::out);
SS->rdbuf()->pubsetbuf( FileData, (std::streamsize)FileDataLen );

pubsetbufは Visual Studio では何もしません!!!

回避策 #1 :

std::stringstream *SS = new std::stringstream( std::string(FileData, (size_type)FileDataLen ) ),std::stringstream::in | std::stringstream::out);

回避策 2 :

SS->rdbuf()->sputn(FileData, (streamsize)FileDataLen);

ただし、これらの回避策は両方とも不要なメモリ コピーを生成します。std::stringbuf の有効なpubsetbufメンバーが絶対に必要です。

4

4 に答える 4

4

putsetbufバッファとストリームが2つの異なるものである場合にのみ意味がありますfstream(技術的には for )。std::basic_filebuf

stringstream(技術的には)std::basic_stringbufそれらはまったく同じ std::string です。

外部の文字列で動作するストリームが必要な場合は、次を検討してstd::strstreamください。boost::iostreams::array_sink

于 2012-04-07T12:20:23.683 に答える
3

basic_ios.clear() rdbuf を変更する必要がある場合は、最初にこれを呼び出さないと機能しません。

std::ifstream file("file1.txt"); // file1.txt contains "Welcome!"
std::stringstream ss;
ss << file.rdbuf();

std::cout << ss.str() << std::endl;

「ようこそ!」を出力します。
新しいファイルでもう一度試してみましょう。

// Empty it
file.close();
ss.str("");

// New file
file.open("file2.txt"); // file2.txt contains "Goodbye!"
ss << file.rdbuf();

std::cout << ss.str() << std::endl;

何も出力しません。

ss.clear();
ss << file.rdbuf();
std::cout << ss.str() << std::endl;
file.close();

「さようなら!」を出力します。

于 2012-12-05T04:22:56.067 に答える