我不明白为什么这看起来似乎失败了错误的2:
char debugText [256];
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
fprintf ( dfile, " err %d \n", errno);
我说貌似是因为当dfile为NULL时,文件会被创建并填充我的输出。
那是怎么回事?
答案 0 :(得分:8)
所有这些都告诉您errno
在fopen
电话后{2}的值为2。您不知道呼叫失败,因为您没有检查是否dfile == NULL
。如果输出实际写入文件,可能是fopen
调用成功,errno
值从之前的某个调用中遗留下来,可能是您未明确发出的。
未接来电可以将errno
设置为某个非零值,但成功调用 将errno
设置为0.要检查错误,您需要< / p>
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;
}
答案 1 :(得分:4)
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
中的此值可能会从其他内容中遗留下来。
答案 2 :(得分:3)
没有库函数将errno
设置为零。
您应该只在功能报告错误后检查errno
。
例如,您的代码应为:
if ((dfile = fopen(debugText, "w")) == 0)
...then fopen() failed and errno is relevant...
如果该功能未报告失败,则errno
中的值可能是任何值。例如,在Solaris上,在成功操作后,通常会将errno
设置为ENOTTY
,因为stdout
未连接到终端。这并不意味着任何事情真的出错了;它只是意味着测试标准输出是否是终端失败(因为它不是终端)。
答案 3 :(得分:0)
就我而言,我在尝试打开文件以在具有 FAT 文件系统的已安装闪存驱动器上写入时得到 errno == 2
;事实证明,如果文件不符合 8.3 rule,fopen
返回 NULL
并将 errno
设置为 ENOENT
。
不得不说,我在嵌入式系统上遇到过这种情况,在 Windows 上应该不是这个问题。