Mac上的fopen功能问题

时间:2014-05-31 21:58:38

标签: 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的代码显示了同样的问题。

3 个答案:

答案 0 :(得分:2)

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

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

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

<强>更新

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

main

这将打印包含可执行文件名的相对路径。如果该文件与可执行文件位于同一位置,则可以使用int main(int argc, char *argv[]) { printf("Path relative to the working directory is: %s\n", argv[0]); return 0; } 替换可执行文件名。这样,它将在两种情况下加载:通过双击运行时以及通过导航到可执行文件的位置从命令行运行时。

您可能还需要在file.txt开头考虑可能的./。希望它有所帮助:)

答案 1 :(得分:0)

我不太确定,但我认为在mac上,程序搜索相对路径的默认目录不是当前目录,而是用户目录。尝试将 file.txt 放入此文件中。

(注意:我记得曾经有过这样的问题,但我不确定是不是和fopen一样。好吧,试试看也不会有伤害。)

答案 2 :(得分:-1)

您可以尝试使用写入来初始化指针。 因此,如果程序找不到该文件,则应该创建一个新文件。这有助于理解什么是幸福的。