boost :: iostreams :: mapped_file_source :: open вызывает код выхода 3 в Windows, но работает в Ubuntu - PullRequest
0 голосов
/ 25 ноября 2018

Я использую mapped_file_source из boost::iostreams namespace для чтения большого файла по частям:

boost::iostreams::mapped_file_source read_bytes(const char *file_path,
                                                unsigned long long int offset,
                                                unsigned long long int length) {
    iostreams::mapped_file_params parameters;
    parameters.path = file_path;
    parameters.length = static_cast<size_t>(length);
    parameters.flags = iostreams::mapped_file::mapmode::readonly;
    parameters.offset = static_cast<boost::iostreams::stream_offset>(offset);

    boost::iostreams::mapped_file_source file;

    file.open(parameters);

    if (file.is_open()) {
        return file;
    } else {
        printf("Failed to open file\n");
        exit(EXIT_FAILURE);
    }
}

Мой код отлично работает для Ubuntu в WSL (Windows Subsystem for Linux), но когда я компилирую и запускаю его в Windows, 2-й вызов file.open заставляет процесс завершиться с кодом выхода 3.

Reading file in 5 parts
Processing chunk 1/5
Processing chunk 2/5

Process finished with exit code 3

Никаких сообщений об ошибках или исключениях не было.Документация предполагает, что это будет ERROR_PATH_NOT_FOUND, но это не имеет смысла.

Я отладил оба бинарных файла платформы, и все переменные были абсолютно идентичны, единственное исключение - путь к файлу в стиле Unixи путь в стиле Windows, а также выделенные адреса и системные временные переменные, поэтому повреждения памяти не произошло.Я не понимаю, почему это не работает на Windows, когда он должен вести себя одинаково.

Я использую MinGW для компиляции для Windows и gcc 8.2 вUbuntu.

"C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin\x86_64-w64-mingw32-gcc.exe" --version
x86_64-w64-mingw32-gcc.exe (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Если я читаю файл за один раз, он отлично работает (!).Я выравниваю все смещения по размеру страницы.mapped_file_source автоматически закрывается, когда выпадает из области видимости, поэтому это не проблема «файл уже открыт» (это может вызвать исключение на Boost).

1 Ответ

0 голосов
/ 11 февраля 2019

Использование MSVC проблема больше не может быть воспроизведена сейчас.В общем, использование компилятора Microsoft для Windows может быть более надежным, чем MinGW, тем более что я использовал "неофициальный" набор инструментов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...