2012-04-07 14 views
2

pubsetbuf Visual Studio 2010でstd :: stringbufのメンバーが全く動作していません!Visual Studio std :: stringstream pubsetbufが動作しない

コード: pubsetbuf

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); 

は、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); 

しかし、これらの回避策の両方が不要メモリコピーを生成します。 私は間違いなく動作が必要ですpubsetbuf std :: stringbufのメンバーです。

答えて

4

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

stringstream(技術的にはstd::basic_stringbuf)の場合、これらは同じstd :: stringです。あなたはそれに外部のだ文字列で動作ストリームが必要な場合は

std::strstreamを考えてみますかboost::iostreams::array_sink

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(); 

出力 "Goodbye!"

関連する問題