【问题标题】:C++17 filesystem call generates segmentation faultC++17 文件系统调用产生分段错误
【发布时间】:2019-07-02 05:14:22
【问题描述】:

根据Size of file using C++17的回复,我编写了如下程序。但是,当可执行文件运行时,我得到一个分段错误。我在运行 High Sierra 的 iMac 上使用 g++ 8.3.0。

// c17filesize.cpp
// Jul-02-2019

#include <cstring>
#include <filesystem>
using namespace std;

int main(int argc, char **argv)
{
    char filename[100];
    (argc > 1) ? strcpy(filename, argv[1]) : strcpy(filename, __FILE__);
    auto size = filesystem::file_size(filename);
}

【问题讨论】:

  • 这不是文件系统,而是您的代码段错误。始终使用 strncpy,而不是 strcpy。在这里你也不需要 - 只需使用 std::string。

标签: c++ c++17


【解决方案1】:
  1. 优先使用字符串(及其构造函数)而不是 c 样式字符串。
  2. 根据https://en.cppreference.com/w/cpp/filesystem/file_size,您必须指定完整路径。您是否验证 argv[1] 拥有完整路径?
  3. 在尝试读取文件大小之前检查文件是否存在 std::filesystem::exists(filename);

  4. 使用 try 和 catch 部分来捕获异常。

【讨论】:

  • (2) - 它在哪里说您需要完整路径? (3),(4) - 这是一个很好的建议,但它不能解决段错误。
【解决方案2】:

在使用 std::filesystem:exists 时遇到了段错误。

使用 GCC 8.3。必须与 -lstdc++fs 链接才能解决问题。

注意:GCC 9+ 解决了这个问题 (https://gcc.gnu.org/gcc-9/changes.html)

【讨论】:

    【解决方案3】:

    使用 gcc 9.1.0 编译成功,没有任何疑虑。

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2017-10-29
      • 1970-01-01
      相关资源
      最近更新 更多