我正在 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/