2012-04-07 92 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(); 

輸出「再見!」