C/C++ 中的文件处理突然中断(Mac OS 13.2.1)。无法编译继续工作

问题描述 投票:0回答:0

我把我的头发拉到这里有一个奇怪的问题,这个问题似乎是自己出现的,我现在对发生的事情一头雾水。

我编译的 C++ 应用程序无法再找到名称中包含空格的文件,许多其他依赖于处理文件的功能被破坏并抛出异常。它在我安装 vscode 并尝试使用 GCC/G++ 编译我的应用程序后突然开始发生

我现在已经删除了 vscode,删除了我的构建目录,cmake 缓存,重新启动了计算机等,但由于某种原因我的代码仍然无法正常工作。

更多信息:

  1. 项目使用的是cmake,我的IDE是clion。但是,如果我只是使用 unix makefile 独立构建应用程序,则会出现同样的问题。 CLion 使用 Ninja
  2. 我可以确认它是用 clang 构建的,因为编译器输出显示了这一点。它设置为使用 C++17 标准。典型的编译命令具有以下标志“-g -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.1.sdk -Wall -Wextra -Wpedantic -Wmultichar -Weffc++ -Wno-deprecated-declarations -std=gnu ++17"
  3. 当我使用带有空格的路径的 ifstream 或 fopen 时,出现以下异常 std::__1::ios_base::failure: ios_base::clear: unspecified iostream_category 错误,并且找不到文件
  4. 如果我重命名/移动文件使其没有空格,文件将打开并可以读取,但是当使用 std::getline(infile, line)... N.B.这至少在过去几周一直运行良好
  5. 我安装了提供各种库的自制软件,它还安装了 GCC/G++
  6. 我试过删除 xcode,破坏我的 bash_profile 和其他项目,但没有任何效果,除了擦除计算机并重新开始,我不知道接下来要寻找什么
  7. 我查看了我的 git 历史记录,我的代码没有任何更改,它突然停止工作。如果做一个小测试项目并尝试使用 ifstream 或 fopen 打开一些文件,也会发生同样的问题。
  8. 使用 std::filesystem::path,返回 true 表示试图读取的文件存在。转义文件名没有用。
  9. 应用程序将继续在使用 g++ 的 Linux 上正常编译和运行

我在 Mac OS Ventura 13.2.1 上使用 Apple M2 Max.

任何帮助将不胜感激

我已经尝试了上面概述的步骤,以及重新启动、重新安装 xcode、删除 GCC/G++、检查环境变量、链接器路径。我还尝试将 C++ 标准更改为 20,我的应用程序编译正常,但错误仍然存在。

这里是现在失败的代码:(注意 Path 是一个 std::filesystem::path,并且 exists() 函数通过得很好,我在它开始中断后添加了用于调试目的的异常)

info() << "Reading " << path.string();

if (!exists(path)) {
    log_error() << "Could not find file " << path.string();
    throw runtime_error("Could not read file " + path.string());
}

std::ifstream infile;

// Enable exceptions for ifstream
infile.exceptions(std::ifstream::failbit | std::ifstream::badbit);

try {
    infile.open(path.string());
} catch (const std::ifstream::failure& e) {
    log_error() << "Error reading the file " << e.what();
    throw runtime_error("Could not read file " + path.string());
}

while (std::getline(infile, line)) {
            std::istringstream iss(line);
........
}

文件路径包含空格。

我也试过用 fopen 打开文件,但也失败了

c++ macos fopen ifstream building
© www.soinside.com 2019 - 2024. All rights reserved.