2016-08-15 2 views
0

Я не могу найти объяснение следующее поведение:Boost.IOStreams: Как правильно перенаправить файловые потоки с помощью 'rdbuf'?

#include <boost/iostreams/device/file.hpp> 
#include <boost/iostreams/stream.hpp> 

#include <iostream> 
#include <sstream> 

TEST_CASE(rdbuf) { 
    { 
    boost::iostreams::stream<boost::iostreams::file_sink> file("test"); 

    file << "Hello, World!"; 
    } 
    { 
    boost::iostreams::stream<boost::iostreams::file_source> file("test"); 
    std::string            line; 

    std::getline(file, line); 
    CHECK_EQUAL(line, "Hello, World!"); 
    } 
    { 
    boost::iostreams::stream<boost::iostreams::file_source> file("test"); 
    std::istringstream          iss; 
    std::string            line; 

    file.rdbuf(iss.rdbuf()); 

    std::getline(file, line); 
    CHECK_EQUAL(line, ""); 

    std::getline(iss, line); 
    CHECK_EQUAL(line, ""); // (1) Why? 
    } 
    { 
    boost::iostreams::stream<boost::iostreams::file_source> file("test"); 
    std::ostringstream          oss; 
    std::string            line; 

    file.rdbuf(oss.rdbuf()); 

    std::getline(file, line); 
    CHECK_EQUAL(line, ""); 

    line = oss.str(); 
    CHECK_EQUAL(line, ""); // (2) Why? 
    } 
} 

В обоих случаях (1) и (2), я скорее ожидал

CHECK_EQUAL(line, "Hello, World!"); 

для достижения успеха.

Что я действительно пропущу здесь? Благодарю.

ответ

0

Вы делаете это неправильно. Вы назначаете streambuf от istringstream до filestream, и вы должны сделать это в другом направлении. I.e .:

boost::iostreams::stream<boost::iostreams::file_source> file("test"); 
std::istringstream          iss; 
std::string            line; 

iss.rdbuf(file.rdbuf()); //assign the file to iss 

std::getline(file, line); 
CHECK_EQUAL(line, "Hello, World!"); 

std::getline(iss, line); 
CHECK_EQUAL(line, ""); // Empty, because the streambuf is shared. 
Смежные вопросы