stringstream写跳过空格

时间:2017-05-17 10:52:51

标签: c++

我的印象是,未格式化的write()会逐字地将字节复制到调用它的ostream。另一个SO用户也告诉我,“写入”功能并没有跳过任何内容。如果您在使用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;行,则输出符合预期,并保留空白字符。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

这与writestringstream无关。

  

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

     

在阅读字符时,默认情况下std::istream_iterator会跳过空格(除非使用std::noskipws或等效字段禁用),而std::istreambuf_iterator则不会。另外,std::istreambuf_iterator更有效率,因为它避免了每个字符构造和破坏一次哨兵对象的开销。