2012-04-07 1 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; 

Выходы «Добро пожаловать!».
Давайте попробуем еще раз с новым файлом.

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

Выходы «До свидания!»