2017-05-17 185 views
1

我的印象是,未格式化的write()会逐字拷贝字节到它所调用的ostream。另一个SO用户也告诉我'Write函数不会跳过任何内容。如果您在使用stringstream时遇到问题,请提出问题。'stringstream写跳过空白

但是,在最近使用stringstream的代码中,我发现情况并非如此。

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    { 
     const std::string msg = "This is a secret message!"; 
     std::stringstream ss; 
     const int size = msg.size(); 
     // ss << std::noskipws; 
     ss.write(reinterpret_cast<const char*>(&size),sizeof(size)); 
     ss.write(msg.data(),msg.size()); 

     std::ofstream out("secret.txt",std::ios::binary); 
     std::transform(std::istream_iterator<char>(ss),std::istream_iterator<char>(), 
         std::ostream_iterator<char>(out),[](const char c) { return c + 113; }); 
    } 

    { 
     std::stringstream ss; 
     std::ifstream in("secret.txt",std::ios::binary); 
     std::transform(std::istream_iterator<char>(in),std::istream_iterator<char>(), 
         std::ostream_iterator<char>(ss),[](const char c) { return c - 113; }); 
     int size; 
     ss.read(reinterpret_cast<char*>(&size),sizeof(size)); 
     std::string msg(size,'@'); 
     ss.read(&msg[0],size); 
     std::cout << "Decoded message is: " << msg << std::endl; 
    } 

    return 0; 
} 

输出此代码如下:

解码消息:Thisisasecretmessage @@@@

然而,如果我取消注释ss << std::noskipws;线则输出是如预期的那样,保留空白字符。

我在这里错过了什么?

+2

您正在过度使用您的测试用例。在写入之后试试'std :: string check = ss.str();'。 –

回答

4

这与writestringstream无关。

http://en.cppreference.com/w/cpp/iterator/istream_iterator

当读取字符,std::istream_iterator跳过默认空白(除非std::noskipws或等效禁用),而std::istreambuf_iterator没有。另外,std::istreambuf_iterator效率更高,因为它避免了每个角色构造和破坏哨兵对象的开销。