当文件存在于macOS上但不存在于linux上时,fopen()返回空指针,为什么以及如何修复此问题?
我试图使用fopen(“somefile”,“r”)来读取与我的C代码(例如:main.C)位于同一目录中的文件(存在) 我正在使用macOS high sierra(由于我的电脑太旧,我无法更新到macOS的最新版本)。当我运行代码时,我得到一个空指针 我还有一台安装了Ubuntu的电脑。当我运行上面相同的代码时,我没有得到空指针 我使用CLion 2020.3作为我的IDE,并通过它运行代码 有没有办法修复macOS上的这种奇怪行为。我尝试过设置绝对路径,但仍然不起作用 我想补充一点,我确定我的文件名和扩展名,我认为问题与此无关 使用perror,我得到以下当文件存在于macOS上但不存在于linux上时,fopen()返回空指针,为什么以及如何修复此问题?,c,null,fopen,clion,C,Null,Fopen,Clion,我试图使用fopen(“somefile”,“r”)来读取与我的C代码(例如:main.C)位于同一目录中的文件(存在) 我正在使用macOS high sierra(由于我的电脑太旧,我无法更新到macOS的最新版本)。当我运行代码时,我得到一个空指针 我还有一台安装了Ubuntu的电脑。当我运行上面相同的代码时,我没有得到空指针 我使用CLion 2020.3作为我的IDE,并通过它运行代码 有没有办法修复macOS上的这种奇怪行为。我尝试过设置绝对路径,但仍然不起作用 我想补充一点,我确定
错误::没有这样的文件或目录
我的目录是这样的
myProject
|____ src
|____ CMakeLists.txt
|____ main.c
|____ main.h
|____ somefile
我厌倦了给出一个文件的完整路径,比如
/Users/username/CLionProjets/myProject/src/somefile
但还是不起作用
编辑*现在它与我在CLionProjets中忘记c的绝对路径一起工作
编辑**我很想知道为什么我需要在macOS上输入绝对路径,而不是在Linux(Ubuntu)上
它与我的C代码(ex:main.C)位于同一目录中
可执行文件应该如何知道您的C代码驻留在哪里?提示:没有。如果指定的文件路径不是绝对路径,则它是相对于当前工作目录的。当前工作目录由启动应用程序的位置和方式决定
在Linux中,请尝试以下操作:
cd /
/absolute/path/to/your/executable
同样的问题。要使其正常工作,您必须在启动应用程序之前适当地更改工作目录。源文件的目录、可执行文件和正在运行的可执行文件的当前目录可能位于不同的位置 您的Mac/OS IDE可能从与linux不同的目录启动程序 您可以通过以下方式确定正在运行的程序的当前目录:
#include <stdio.h>
#include <unistd.h>
int main() {
char buf[MAX_PATH];
if (getcwd(buf, MAX_PATH)) {
printf("no current directory for %s\n", argv[0]);
} else {
printf("current directory for %s: %s\n", argv[0], buf);
}
...
}
#包括
#包括
int main(){
char buf[MAX_PATH];
if(getcwd(buf,MAX_路径)){
printf(“没有%s的当前目录”,argv[0]);
}否则{
printf(“%s的当前目录:%s\n”,argv[0],buf);
}
...
}
perror给em错误::没有这样的文件或目录检查代码运行的默认目录。可执行文件不一定是用代码在目录中启动的。或者使用完整的路径。我使用了完整的路径,但它仍然不起作用:/I我将路径添加到了问题详细信息中,这太愚蠢了。我忘了c。现在它工作了!要启动应用程序,在检测到CMakeLists.txt后,我正在使用CLion IDE上的play按钮。如何更改工作目录以使其工作?@Nassims:IDE中可能有一个设置或此设置,或者它可能从生成该目录的目录运行可执行文件,该目录不一定与源代码或CMakeLists.txt
文件相同。您可以打印可能指示可执行文件的完整路径的argv[0]
。@chqrlie:surefire方法是只拍打achar b[path_MAX];fprintf(stderr,“cwd:'%s'\n',getcwd(b,PATH_MAX))
在main
@datenwolf:好的一点,但是请注意,getcwd()
可能会返回NULL
,如果当前路径无法确定,例如如果程序启动时的当前目录随后被删除,这在Unix系统上是可能的。@chqrlie:Yes,但是将NULL传递给%s
是一种很好的实现定义行为,只会导致为所有重要的标准库打印(NULL)
。
#include <stdio.h>
#include <unistd.h>
int main() {
char buf[MAX_PATH];
if (getcwd(buf, MAX_PATH)) {
printf("no current directory for %s\n", argv[0]);
} else {
printf("current directory for %s: %s\n", argv[0], buf);
}
...
}