pubsetbuf std::成员在Visual 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中什么也不做!
解决方案#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成员::stringbuf。
发布于 2012-04-07 12:20:23
putsetbuf只对fstream有意义(从技术上讲,对于std::basic_filebuf),其中缓冲区和流是两种不同的东西。
对于stringstream (技术上来说,std::basic_stringbuf),它们是同一个std::std::basic_stringbuf。
如果您需要一个在其外部的字符串上工作的流,请考虑std::strstream:或boost::iostreams::array_sink
发布于 2012-12-05 04:22:56
如果您需要更改rdbuf,请先调用ios.clear(),否则它将无法工作。
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();输出“再见!”
发布于 2018-03-23 02:37:14
我也看到了同样的事情。我正在研究的场景肯定负担不起复制不必要的数据。根据basic_streambuf类中的注释,这似乎是有意的:
virtual basic_streambuf *__CLR_OR_THIS_CALL setbuf(_Elem *, streamsize)
{ // offer buffer to external agent (do nothing)
return (this);
}https://stackoverflow.com/questions/10054396
复制相似问题