не работает фильтр ZLIB в Windows - PullRequest
0 голосов
/ 27 июня 2018

Я написал код для непосредственного чтения сжатого файла .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 ;
    }
}

при запуске под ./a.out < compressed.z на linux или mac работает нормально

при запуске из windows uncompressed.exe < compressed.z не отображается содержимое файла.

Почему это так?

1 Ответ

0 голосов
/ 27 июня 2018

std::cin не открывается в двоичном режиме, поэтому он выполняет преобразование конца строки в Windows, по умолчанию повреждая все входные файлы. Есть два решения:

  1. Никогда, никогда не используйте Windows и не пытайтесь писать приложения для нее.
  2. Используйте _setmode( _fileno(stdin), _O_BINARY ) для преобразования stdin в двоичный режим.
...