C++ Mac上fopen函数的问题

C++ Mac上fopen函数的问题,c++,c,macos,fopen,C++,C,Macos,Fopen,我正在Mac上制作一个简单的应用程序(OSX Mavericks,用clang编译)。 问题是,当我尝试使用相对路径打开文件时,它不起作用。如果我使用绝对路径,它会工作 例如,如果我尝试:fp=fopen(“file.txt”,“r”) 它返回NULL 它只在我使用时有效:fp=fopen(“User/UserName/Project_folder/file.txt”,“r”) (project folder是我正在编译的文件夹,其中包含我的file.txt文件) 该文件位于完全相同的目录中 我

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

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

它返回
NULL

它只在我使用时有效:
fp=fopen(“User/UserName/Project_folder/file.txt”,“r”)
(project folder是我正在编译的文件夹,其中包含我的file.txt文件)

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

我怎样才能解决这个问题


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

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

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

有关工作目录的信息,请参阅

更新

如果您可以访问
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]
开头可能出现的
/
。希望它有帮助:)

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

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

有关工作目录的信息,请参阅

更新

如果您可以访问
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]
开头可能出现的
/
。希望有帮助:)

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


(注意:我记得有一次遇到过这样的问题,但我不确定是否是fopen的问题。嗯,尝试一下也无妨…

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


(注意:我记得有一次遇到过这样的问题,但我不确定这是否与fopen有关。好吧,尝试一下也无妨…

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

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

我知道这两个目录都在同一个目录中。但是现在文件不会加载更多。感谢您的帮助:)当您在命令行中键入
pwd
时,它是否会显示与file.txt相同的路径?当我双击打开应用程序时,它不会使用它所在的工作目录。我怎样才能解决它?这个问题出现在这里的时间不多。当你双击它时,你的工作目录就是二进制文件的目录。我知道这两者都在同一个目录中。但是现在文件不会加载更多。感谢您的帮助:)当您在命令行中键入
pwd
时,它是否会显示与file.txt相同的路径?当我双击打开应用程序时,它不会使用它所在的工作目录。我怎样才能解决它?出现此问题的时间不多。双击运行时,您的工作目录是binaries的目录。file.txt需要位于运行程序的同一控制器中。参见下面我的帖子。does
fp=fopen(“./file.txt”,“r”)工作?@Andro47:Prepending
/
没有帮助;T