C 为什么';打开现有文件?(返回NULL,errno enoint)

C 为什么';打开现有文件?(返回NULL,errno enoint),c,segmentation-fault,fopen,C,Segmentation Fault,Fopen,我已将此贴出以记录我的问题,请参见下面的自我回答。 无论我如何尝试,fopen(…)都无法打开现有文件的路径,该路径存在并返回NULL我正在从~/path中的bash脚本执行程序。程序文件存储在~/path/to 记录为可能出现以下故障: 否则,将返回NULL,并设置errno以指示错误 因此,您至少应该编写以下代码: FILE* fp = fopen(filename, "r"); if (fp == NULL) { perror(filename); exit(EXIT_FAILURE);

我已将此贴出以记录我的问题,请参见下面的自我回答。

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

记录为可能出现以下故障:

否则,将返回NULL,并设置
errno
以指示错误

因此,您至少应该编写以下代码:

FILE* fp = fopen(filename, "r");
if (fp == NULL) { perror(filename); exit(EXIT_FAILURE); };
而且
fopen
甚至不会尝试创建一个只供阅读的文件

根据经验,您始终需要检查
fopen
的故障(如上所述的最小值),并向您的用户报告故障原因(在-As
strerror(errno)
-…)的帮助下)。受过教育的用户将能够进行管理(可能需要系统管理员的帮助)

enoint
记录在

enoint
没有这样的文件或目录(POSIX.1-2001)

通常,当指定的路径 名称不存在,或中的某个组件不存在 路径名的目录前缀不存在,或者 指定的路径名是悬空符号链接

我觉得这个解释很清楚。在您的情况下,您当前可能没有任何
path/
目录,或者您确实有
path/to/my/
目录,但没有任何
文件
条目等(例如
path/
存在,但其中没有
to/


您可以通过不仅显示
errno
(使用
strerror(errno)
perror
)而且显示工作目录来改进程序。看见或者你可以让你的用户去猜。您的用户可能已经更改了工作目录,例如,使用他的
cd
内置命令。

您是否尝试使用绝对路径-取消对工作目录的更改。为了调试问题,您可以使用
w+
打开文件,然后搜索文件系统以了解您的路径是如何插入的。一个好主意是验证文件及其路径的正确权限。您的主要错误是无法处理
fopen
的故障。你总是需要处理这个问题!请注意,文件路径名是相对于进程的当前目录计算的,该目录与程序存储在磁盘上的目录无关。该文件显然不存在
/path/to/my/file
-它可能存在于
$(dirname$(哪个程序))/path/to/my/file
,但这是完全不同的。不,我想教你一些好的做法。。。很少有情况下不应检查
fopen
的故障。因为和建议这样做。实际上,
exit
的参数应该是大约8位无符号数(至少在Linux上是这样),并且
exit\u FAILURE
是根据C11标准定义的。下次,请阅读文档(包括
fopen
man
页面中提到的
errno
),谢谢,这就是问题的诊断方法。@nolan.:如果这有助于选择答案。无论如何,再加上一个好答案。
FILE* fp = fopen(filename, "r");
if (fp == NULL) { perror(filename); exit(EXIT_FAILURE); };