我在Mac上制作一个简单的应用程序(OSX Mavericks,用clang编译)。 问题是,当我尝试使用相对路径打开文件时,它不起作用。如果我使用绝对路径,它就可以工作。
例如,如果我尝试:fp = fopen("file.txt", "r");
返回NULL
。
只有在我使用时才有效:fp = fopen(" User/UserName/Project_folder/file.txt", "r");
(项目文件夹是我编译的文件夹,它有我的file.txt)
该文件位于完全相同的目录中。
我如何解决这个问题?
同样的代码前段时间也运行良好,现在这个和其他使用fopen
的代码显示了同样的问题。
答案 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)
您可以尝试使用写入来初始化指针。 因此,如果程序找不到该文件,则应该创建一个新文件。这有助于理解什么是幸福的。