Как читать файлы в каталоге на Linux? - PullRequest
8 голосов
/ 26 апреля 2019

Я пытаюсь прочитать файлы в указанном каталоге в Ubuntu 19.04.Я планирую использовать directory_iterator в стандартной библиотеке.Я использую CLion IDE, которая использует компилятор в каталоге "usr / bin / c ++".Я предполагаю, что это компилятор g ++, а версия g ++ в моей системе - 8.3.Используемая версия C ++ - C ++ 17.

Мне удалось успешно выполнить код в Visual Studio 2017 в Windows 10. Но код привел к ошибке ошибки сегментации в Ubuntu при использовании CLion.Код ниже взят со страницы cppreference о directory_iterator.

#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
    fs::create_directories("sandbox/a/b");
    std::ofstream("sandbox/file1.txt");
    std::ofstream("sandbox/file2.txt");
    for(auto& p: fs::directory_iterator("sandbox"))
        std::cout << p.path() << '\n';
    fs::remove_all("sandbox");
}

Я ожидал, что код распечатает файлы в данной папке, но вместо этого получил Segfault.

Процесс завершен с кодом выхода 139 (прерван сигналом 11: SIGSEGV).

В чем может быть причина этой проблемы?Может ли проблема быть связана с CMake?

1 Ответ

4 голосов
/ 26 апреля 2019

похоже на ошибку в gcc 8.3

Если вы запустите его , соединение не будет установлено. Может быть, в вашем окружении ошибка может стать причиной ошибки.

Но если вы обновитесь до gcc 9.1: , он будет работать нормально .

Clang 9 тоже отлично , но все версии до этого не компилируются

Редактировать: Как сказал Галик , если вы добавите флаг -lstdc++fs , похоже, он будет работать

Источник: https://en.cppreference.com/w/cpp/filesystem

Примечания

Использование этой библиотеки может потребовать дополнительных опций компилятора / компоновщика. Реализация GNU требует соединения с -lstdc ++ fs, а реализация LLVM требует соединения с -lc ++ fs

...