C fopen写错了,errno是2

时间:2013-04-01 22:32:38

标签: c fopen errno

我不明白为什么这看起来似乎失败了错误的2:

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

我说貌似是因为当dfile为NULL时,文件会被创建并填充我的输出。

那是怎么回事?

4 个答案:

答案 0 :(得分:8)

所有这些都告诉您errnofopen电话后{2}的值为2。您不知道呼叫失败,因为您没有检查是否dfile == NULL。如果输出实际写入文件,可能是fopen调用成功,errno值从之前的某个调用中遗留下来,可能是您未明确发出的。

未接来电可以将errno设置为某个非零值,但成功调用 errno设置为0.要检查错误,您需要< / p>

  • 在通话前将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;
}

答案 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 rulefopen 返回 NULL 并将 errno 设置为 ENOENT

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