我已经发布了此信息以记录我的问题,请参阅下面的自我答案。
无论我尝试什么,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
内置命令。