c++ - Mac 上的 fopen 函数问题

标签 c++ c macos fopen

我正在 Mac 上制作一个简单的应用程序(OSX Mavericks,使用 clang 编译)。 问题是当我尝试使用相对路径打开文件时,它不起作用。如果我使用绝对路径,它会起作用。

例如,如果我尝试:fp = fopen("file.txt", "r");

它返回 NULL

它仅在我使用时有效:fp = fopen("User/UserName/Project_folder/file.txt", "r"); (项目文件夹就是我编译的文件夹,里面有我的file.txt)

文件位于完全相同的目录中。

我该如何解决这个问题?

同样的代码在前一段时间运行良好,现在这段代码和其他使用 fopen 的代码都出现了同样的问题。

最佳答案

当您在没有完整路径的情况下运行 fopen 时,它会使用您运行程序所在位置的当前工作目录。因此,如果您的工作目录(通过在 shell 中键入 pwd 获得)您从中执行程序的位置~/my_folder/file .txt 恰好在 ~/my_folder/bin/ 那么即使你的可执行文件在 ~/my_folder/bin/ 它也不会找到 文件.txt。因为它将寻找 ~/my_folder/file.txt

因此,如果您从不同于 file.txt 的目录运行程序,那么您要么必须提供绝对路径,要么提供相对于您运行程序的目录的路径。

有关工作目录的信息,请参阅 http://www.linfo.org/current_directory.html

更新

如果您有权访问 main 方法的字符串数组参数 (argv[]),则可以使用一种解决方法。 argv 的第一个元素将包含用于执行程序的路径(来自工作目录)。按照简单的程序简单打印该参数。

int main(int argc, char *argv[])
{
  printf("Path relative to the working directory is: %s\n", argv[0]);
  return 0;
}

这将打印包含可执行文件名称的相对路径。如果该文件与可执行文件位于同一位置,则可以用 file.txt 替换可执行文件名称。这样它将在两种情况下加载:通过双击运行时以及通过导航到可执行文件的位置从命令行运行时。

您可能还必须考虑 argv[0] 开头的可能的 ./。希望对您有所帮助:)

关于c++ - Mac 上的 fopen 函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974831/

相关文章:

c++ - 矮人错误 : Cannot find DIE

c++ - GCC中格式错误的C/C++多维数组初始化

c++ - 模板问题 ('typename' 因为不是模板函数参数)

c# - 在 C# 中容纳嵌套的不安全结构

c - 将负整数转换为二进制时出现段错误

cocoa - 是否行程矩形 : of NSBezierPath always draw a transparent rect? (Cocoa OSX)

python - 在 Homebrew 程序中使用系统Python

c++ - 是否应该将 GUI 应用程序警告消息发送到 std::cerr?

c++ - 附加进程时 boost 删除 managed_shared_memory

c - 快速排序算法中的分段故障(堆芯故障)