我不明白为什么这似乎因 errno 为 2 而失败:
char debugText [256];
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
fprintf ( dfile, " err %d \n", errno);
我说似乎是因为当 dfile 为 NULL 时,文件被创建并充满了我的输出。
那么发生了什么 ?
所有这一切都告诉你,在你打电话errno
后它的值是 2 。fopen
你不知道调用失败,因为你没有检查是否dfile == NULL
. 如果输出实际上已写入文件,则可能fopen
调用成功,并且该errno
值是以前的调用遗留下来的,可能是您没有明确进行的调用。
失败的调用可以设置errno
为一些非零值,但成功的调用不设置errno
为 0。要检查错误,您需要
errno
为0;errno
——但前提是你知道它失败了(否则 的值errno
是没有意义的)。如果defile == NULL
,则fprintf
调用具有未定义的行为;它可能会失败。
另一方面,你说那dfile
是NULL
。你怎么知道?你的代码没有检查它。(如果fopen
调用真的失败C:\List.txt
了,你的程序之前运行的内容是否会遗留下来?)
你从这个程序中得到什么输出?
#include <stdio.h>
#include <errno.h>
int main(void) {
char debugText [256];
FILE *dfile;
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
if (dfile == NULL) {
printf("fopen failed, errno = %d\n", errno);
}
else {
printf("fopen succeeded\n");
}
return 0;
}
2 ENOENT No such file or directory. A component of a specified pathname
did not exist, or the pathname was an empty string.
以下是错误代码列表:
http://www.thegeekstuff.com/2010/10/linux-error-codes/
但是您应该先检查是否fopen()
返回NULL
,因为这个值errno
可能是从其他东西中遗留下来的。
没有库函数会设置errno
为零。
您应该只errno
在函数报告错误后进行检查。
例如,您的代码应该是:
if ((dfile = fopen(debugText, "w")) == 0)
...then fopen() failed and errno is relevant...
如果函数没有报告失败,则 in 的值errno
可以是任何值。例如,在 Solaris 上,您通常会在成功操作后errno
设置为ENOTTY
,因为stdout
未连接到终端。这并不意味着实际上出了什么问题。它只是意味着测试标准输出是否是终端失败(因为它不是终端)。
就我而言,我errno == 2
在尝试打开文件以使用 FAT 文件系统在已安装的闪存驱动器上写入时遇到了;事实证明,如果文件不符合8.3 规则,则fopen
返回NULL
并设置errno
为ENOENT
.
有必要说,我在嵌入式系统上遇到过这种情况,这不应该是 Windows 上的问题。