如何在Linux上的目录中读取文件?

Ayd*_*can 8 c++ gcc segmentation-fault c++17

我正在尝试在Ubuntu 19.04上的给定目录中读取文件。我打算在标准库中使用directory_iterator。我正在使用CLion IDE,它在目录“ usr / bin / c ++”中使用编译器。我猜这是g ++编译器,我系统中的g ++版本是8.3。我正在使用的C ++版本是C ++ 17。

我能够在Windows 10上的Visual Studio 2017上成功运行代码,但是在使用CLion时,代码在Ubuntu上产生了分段错误错误。以下代码来自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");
}
Run Code Online (Sandbox Code Playgroud)

我希望代码可以打印给定文件夹中的文件,但我却得到了Segfault。

该过程以退出代码139(被信号11:SIGSEGV中断)完成。

这个问题背后的原因可能是什么?问题可能与CMake有关吗?

Mar*_*rol 4

看起来像是 gcc 8.3 中的一个错误

如果运行它,它将无法链接。可能是在您的环境中该错误导致了段错误。

但如果你更新到 gcc 9.1:它工作正常

Clang 9也很好,但是之前的所有版本都无法编译

编辑:正如加利克所说,如果添加标志,-lstdc++fs 它似乎可以工作

来源: https: //en.cppreference.com/w/cpp/filesystem

笔记

使用此库可能需要额外的编译器/链接器选项。GNU 实现需要与 -lstdc++fs 链接,LLVM 实现需要与 -lc++fs 链接