std :: stringstream和std :: ios :: binary

时间:2010-02-22 14:19:01

标签: c++ visual-studio-2008 iostream

我想写一个std::stringstream而没有任何转换,比如行结尾。

我有以下代码:

void decrypt(std::istream& input, std::ostream& output)
{
    while (input.good())
    {
        char c = input.get()
        c ^= mask;
        output.put(c);

        if (output.bad())
        {
            throw std::runtime_error("Output to stream failed.");
        }
    }
}

以下代码就像魅力一样:

std::ifstream input("foo.enc", std::ios::binary);
std::ofstream output("foo.txt", std::ios::binary);
decrypt(input, output);

如果我使用以下代码,我会遇到输出处于错误状态的std::runtime_error

std::ifstream input("foo.enc", std::ios::binary);
std::stringstream output(std::ios::binary);
decrypt(input, output);

如果我删除std::ios::binary解密函数完成且没有错误,但我最终将CR,CR,LF作为行结尾。

我正在使用VS2008并且尚未在gcc上测试代码。这是它应该表现的方式还是MS的std::stringstream被破坏的实现?

我是如何以正确的格式将内容导入std::stringstream的?我尝试将内容放入std::string,然后使用write(),结果也相同。

2 个答案:

答案 0 :(得分:12)

AFAIK,binary标记仅适用于fstream,而stringstream从不进行换行转换,因此在此处最无用。

此外,传递给stringstream的ctor的标记应包含inout或两者。在您的情况下,out是必要的(或者更好,使用ostringstream)否则,流不处于输出模式,这就是写入它失败的原因。

stringstream ctor的“mode”参数的默认值为in|out,这解释了当您未传递任何参数时,事情正常工作的原因。

答案 1 :(得分:-2)

尝试使用

std::stringstream output(std::stringstream::out|std::stringstream::binary);