Boost zlib过滤器在Windows中不起作用

时间:2018-06-26 23:10:55

标签: c++ boost zlib boost-iostreams

我已经编写了直接读取.z压缩文件的代码。 它在linux和mac os上都能正常工作。但这在Windows中无法正常工作。

#include <iostream>
#include <vector>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/zlib.hpp>
// cl /EHsc uncompress.cpp

std::vector<char> & readline(std::istream & stream, std::vector<char> & container) {
    char c;
    container.clear();
    while (stream && stream.get(c)) {
        container.push_back(c);
        if (c == '\n') break;
    }
    return container;
}

int main () {
    boost::iostreams::filtering_istream in;
    boost::iostreams::filtering_istream cinn(std::cin);
    in.push(boost::iostreams::zlib_decompressor());
    in.push(cinn);

    std::vector<char> line;
    while (readline(in, line).size() != 0) {
        std::string str(line.begin(), line.end());
        std::cout << "--" << str ;
    }
}

在Linux或Mac上以./a.out < compressed.z的身份运行它时,效果很好

从Windows uncompressed.exe < compressed.z运行它时,它不显示文件的内容。

为什么这样?

1 个答案:

答案 0 :(得分:0)

std::cin未以二进制模式打开,因此它在Windows上进行行尾转换,默认情况下会破坏所有输入文件。有两种解决方案:

  1. 从不使用Windows,或尝试为其编写应用程序。
  2. 使用_setmode( _fileno(stdin), _O_BINARY )stdin转换为二进制模式。