2012-04-07 94 views
2

pubsetbuf std :: stringbuf的成员在Visual Studio 2010中根本不起作用!Visual Studio std :: stringstream 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); 

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

但是这两个解决方法产生不必要存储器复印。 我绝对需要工作pubsetbuf std :: stringbuf的成员。

回答

4

putsetbuf只适用于fstream(技术上,对于std::basic_filebuf),其中缓冲区和流是两个不同的东西。

对于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; 

输出“Welcome!”。
让我们再试一个新文件。

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

输出“再见!”