【问题标题】:Problems with fopen function on MacMac 上 fopen 功能的问题
【发布时间】:2014-05-31 21:58:38
【问题描述】:

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

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

它返回NULL

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

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

我该如何解决这个问题?

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

【问题讨论】:

  • file.txt 需要位于您运行程序的同一目录中。请参阅下面的帖子。
  • fp = fopen("./file.txt", "r"); 工作吗?
  • @Andro47:添加./ 无济于事;这仍然是一个相对路径。
  • fp = fopen("./file.txt", "r");不要帮助,现在我更好地理解了这个问题,但我无法解决。如果我使用终端运行编译的文件,它会找到文件(工作目录与文件相同)。但是当我双击打开它时,它会运行,但工作目录与文件目录不同。更准确地说,它使用 /user 作为工作目录打开。这个出现在这里的时间不多了。几次之前我都没有这个问题。
  • @BrenoRodrigues 在下面看到我的更新。

标签: c++ c macos fopen


【解决方案1】:

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

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

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

更新

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

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

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

您可能还需要考虑argv[0] 开头可能出现的./。希望对你有帮助:)

【讨论】:

  • 两者都在同一个目录中,我知道这一点。但现在文件不再加载。感谢您的帮助:)
  • 当你在命令行输入pwd时,它显示的路径是否和file.txt一样?
  • 当我双击打开的应用程序不使用它的工作目录。我该如何解决?这个问题出现在这里的时间不多。
  • 双击运行时,你的工作目录就是二进制文件的目录。
【解决方案2】:

我不太确定,但我认为在 mac 上,程序搜索相对路径的默认目录不是当前目录,而是用户目录。试着把 file.txt 放在这个里面。

(注意:我记得曾经遇到过这样的问题,但我不确定是 fopen 的问题。好吧,试一试也无妨……)

【讨论】:

  • 这正是我遇到的
【解决方案3】:

您可以尝试通过写入来初始化指针。 因此,如果程序找不到该文件,它应该创建一个新文件。这可能有助于了解发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多