C语言 fopen()返回NULL指针,而文件存在于macOS上,但不存在于linux上,为什么以及如何解决这个问题?&



我试图使用fopen("somefile", " ")来读取与我的C代码(例如:main.c)在同一目录中的文件(存在)。

FILE *myFile = fopen("somefile", "r");
if(myFile == NULL){
prinf("the pointer returns null");
}

我使用的是macOS high sierra(我无法更新到最新版本的macOS,因为我的电脑太旧了)。当我运行代码时,我得到一个空指针。

我有另一台安装了Ubuntu的电脑。当我运行上面相同的代码时,我没有得到空指针。

我使用CLion 2020.3作为我的IDE,我通过它运行代码。

有没有办法修复macOS上这个奇怪的行为?我试过把绝对路径,但它仍然不工作。

我想补充一点,我很确定我的文件名和扩展名,我认为问题与此无关。

使用error,我得到以下Error: : No such file or directory

我的目录是这样的

myProject
|____ src
|____ CMakeLists.txt
|____ main.c
|____ main.h
|____ somefile

我累了给一个文件的完整路径,如

/Users/username/CLionProjets/myProject/src/somefile

但仍然不能工作。

EDIT*现在它与绝对路径一起工作,我忘记了CLionProjets中的c。

编辑**我很想知道为什么我需要在macOS上放入绝对路径,而不是在Linux (Ubuntu)上?

与我的C代码(例如: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 %sn", argv[0]);
} else {
printf("current directory for %s: %sn", argv[0], buf);
}
...
}

最新更新