c语言 - 为什么 fopen 不打开现有文件?(返回 NULL, errno ENOENT)



我已经发布了此信息以记录我的问题,请参阅下面的自我答案。

无论我尝试什么,fopen(...)都无法在存在并返回NULL的路径上打开现有文件。我正在从~/path中的BASH脚本执行程序。程序文件存储在~/path/to

int main(void) {
  const char* filename = "my/file"
  FILE* fp = NULL;
  fp = fopen(filename, "r"); // file is still NULL, segfaults on indirection
  if (!fp) exit(1);
  fclose(fp);
}

fopen(3(被记录为能够失败:

否则,返回null并将errno设置为指示错误。

因此,您至少应该代码:

FILE* fp = fopen(filename, "r");
if (fp == NULL) { perror(filename); exit(EXIT_FAILURE); };

fopen甚至不会尝试创建您只能阅读的文件。

作为经验法则, you 始终需要检查fopen (如上所述的最小值(,然后向您的用户报告(借助Errno,(3(,Perror(3(,Strerror(3(用作strerror(errno)- ...(失败的原因。受过教育的用户将能够管理(也许是在他的Sysadmin的帮助下(。

ENOENT在Errno(3(中记录为Mean

ENOENT没有这样的文件或目录(Posix.1-2001(。

通常,当指定路径 - 名称不存在,或者是一个组件之一 路径名的目录前缀不存在,或 指定的路径名是一个悬挂的符号链接。

我发现这种解释很清楚。在您的情况下,您当前的工作目录中可能没有任何path/目录,或者您确实具有path/to/my/目录,而没有任何file输入等(例如,path/都存在,但其中没有to/(....

>

您可以通过不仅显示errno(使用strerror(errno)perror(,还可以显示工作目录来改进程序。请参阅GetCWD(3(。或者,您可以让用户猜测它。您的用户可能已经更改了工作目录,例如用他的Unix shell的cd内置命令。

最新更新