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;
线则输出是如预期的那样,保留空白字符。
我在这里错过了什么?
您正在过度使用您的测试用例。在写入之后试试'std :: string check = ss.str();'。 –