【发布时间】:2017-05-17 10:52:50
【问题描述】:
我的印象是未格式化的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; 行,则输出如预期的那样,保留空白字符。
我在这里错过了什么?
【问题讨论】:
-
您正在过度设计您的测试用例。写完后试试
std::string check = ss.str();。
标签: c++