C++ Mac上fopen函数的问题
我正在Mac上制作一个简单的应用程序(OSX Mavericks,用clang编译)。 问题是,当我尝试使用相对路径打开文件时,它不起作用。如果我使用绝对路径,它会工作 例如,如果我尝试: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文件) 该文件位于完全相同的目录中 我
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需要位于运行程序的同一控制器中。参见下面我的帖子。doesfp=fopen(“./file.txt”,“r”)代码>工作?@Andro47:Prepending/
没有帮助;T