2016-08-15 3 views
0

Ich kann unmöglich Erklärung für das folgende Verhalten finden:Boost.IOStreams: Wie man Dateiströme mit 'rdbuf' richtig umleitet?

#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? 
    } 
} 

In beiden Fällen (1) und (2), erwartete ich eher

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

erfolgreich zu sein.

Was vermisse ich eigentlich hier? Vielen Dank.

Antwort

0

Sie machen es falsch herum. Sie ordnen die streambuf von der istringstream der filestream zu und Sie sollten es in die andere Richtung tun. Beispiel:

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.