c++ - stringstream 写入跳过空格

标签 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;
}

此代码的输出如下:

Decoded message is: Thisisasecretmessage!@@@@

但是,如果我取消注释 ss << std::noskipws;行,则输出如预期,保留空白字符。

我在这里缺少什么?

最佳答案

这与writestringstream无关。

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

When reading characters, std::istream_iterator skips whitespace by default (unless disabled with std::noskipws or equivalent), while std::istreambuf_iterator does not. In addition, std::istreambuf_iterator is more efficient, since it avoids the overhead of constructing and destructing the sentry object once per character.

关于c++ - stringstream 写入跳过空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44022801/

相关文章:

c++ - 使用现代 OpenGL 渲染纹理

c++ - 成员函数替代名称

c++ - 如何获得 winMain hInstance? Windows 32 编程

c++ - 同一系统上的两个版本的 glibc

c++ - 如何按列复制 vector ?

c++ - 这个计算素数的程序能走多远?

c++ - 在 C++ 中,如何在派生类中重载二元运算符?

c++ - 使用索引而不是名称来访问类成员变量

c++ - 使用 pthreads 时的后台线程(不错,优先级)

c++ - 尝试/捕获 C++ 类构造函数的 "in the middle"