微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试使用 fopen("somefile","r") 读取与我的 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 上修复这种奇怪的行为。我试过设置绝对路径,但还是不行。

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

使用 perror 我得到以下 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 %s\n",argv[0]);
    } else {
        printf("current directory for %s: %s\n",argv[0],buf);
    }
    ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。