【问题标题】:How to read files from a directory in c++ in a platform independent way?如何以独立于平台的方式从 C++ 目录中读取文件?
【发布时间】:2020-09-05 00:08:07
【问题描述】:

我有一项任务要求我开发一个程序并通过 文件名或目录名。

如果传递的是目录名,那么我必须读取该目录中的所有文件并基本上对它们进行一些处理。

问题是我使用的是 c++,而 c++ 在没有第三方/系统库的情况下不能很好地处理文件系统。

由于我使用的是 windows 机器而分级机使用的是 linux 机器,我如何才能从不依赖平台的目录中读取所有文件。

我尝试使用文件系统,我有 gcc 9.2 但它无法编译

它不编译这个文件:

#include <iostream> 
#include <filesystem>

namespace fs = std::filesystem;

int main(){
    
    fs::path p("some-path");
 
}

这会导致编译器错误:

testfs.cpp:4:21: error: 'filesystem' is not a namespace-name
    4 | namespace fs = std::filesystem;
      |                     ^~~~~~~~~~
testfs.cpp: In function 'int main()':
testfs.cpp:8:5: error: 'fs' has not been declared
    8 |     fs::path p("some-path");
   

【问题讨论】:

  • GCC 9.2 不默认编译为 c++17 标准版本,第一个支持文件系统。通过将-std=c++17 添加到命令行来强制它。有和没有的例子:godbolt.org/z/Tj6car
  • 我完全惊呆了,我找不到像样的副本。
  • “开箱即用的 c++ 并不能很好地与文件系统配合使用”除了您的编译器错误(这不是“c++ 与文件系统一起使用”)之外,您还不清楚您指的是什么一般问题
  • @user4581301 相同的问题,但不同的 gcc 版本和标志:stackoverflow.com/questions/48312460/…
  • 看到那个了。杀手锏更多的是 GCC 版本早于 C++17 版本/

标签: c++ filesystems cross-platform


【解决方案1】:

filesystem::path 是迄今为止最好的跨平台解决方案,其编译器支持 C++17、第一个支持 filesystem 或更新的标准版本。

GCC 9.2 不默认编译为 c++17 标准修订版。

通过将 -std=c++17 添加到命令行、在 IDE 的编译器选项属性页中选择 C++17 方言或编辑适当的配置文件以添加选项来强制支持 C++17。

带有和不带有额外编译器选项的示例:https://godbolt.org/z/Tj6car

如果您的系统上没有 C++17 或更新的编译器,请考虑使用boost::filesystem

【讨论】:

  • 在我添加-std=c++17后它工作了,g++确实没有默认编译成c++17
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
相关资源
最近更新 更多