10

我不明白为什么这似乎因 errno 为 2 而失败:

char debugText [256];
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
fprintf ( dfile, "  err %d \n", errno);

我说似乎是因为当 dfile 为 NULL 时,文件被创建并充满了我的输出。

那么发生了什么 ?

4

4 回答 4

13

所有这一切都告诉你,在你打电话errno后它的值是 2 。fopen你不知道调用失败,因为你没有检查是否dfile == NULL. 如果输出实际上已写入文件,则可能fopen调用成功,并且该errno值是以前的调用遗留下来的,可能是您没有明确进行的调用。

失败的调用可以设置errno为一些非零值,但成功的调用设置errno为 0。要检查错误,您需要

  • 调用前设置errno为0;
  • 进行调用并检查它返回的值,看它是成功还是失败;和
  • 在调用之后检查 的值errno——但前提是你知道它失败了(否则 的值errno是没有意义的)。

如果defile == NULL,则fprintf调用具有未定义的行为;它可能会失败。

另一方面,你说那dfileNULL。你怎么知道?你的代码没有检查它。(如果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;
}
于 2013-04-01T22:38:34.820 回答
7
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可能是从其他东西中遗留下来的。

于 2013-04-01T22:34:14.277 回答
5

没有库函数会设置errno为零。

您应该只errno在函数报告错误后进行检查。

例如,您的代码应该是:

if ((dfile = fopen(debugText, "w")) == 0)
    ...then fopen() failed and errno is relevant...

如果函数没有报告失败,则 in 的值errno可以是任何值。例如,在 Solaris 上,您通常会在成功操作后errno设置为ENOTTY,因为stdout未连接到终端。这并不意味着实际上出了什么问题。它只是意味着测试标准输出是否是终端失败(因为它不是终端)。

于 2013-04-01T22:51:07.587 回答
0

就我而言,我errno == 2在尝试打开文件以使用 FAT 文件系统在已安装的闪存驱动器上写入时遇到了;事实证明,如果文件不符合8.3 规则,则fopen返回NULL并设置errnoENOENT.

有必要说,我在嵌入式系统上遇到过这种情况,这不应该是 Windows 上的问题。

于 2021-05-18T06:07:25.983 回答