首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C fopen写入失败,errno为2

C fopen写入失败,errno为2
EN

Stack Overflow用户
提问于 2013-04-02 06:32:38
回答 4查看 57.9K关注 0票数 10

我不明白为什么这看起来失败了,错误号为2:

代码语言:javascript
运行
复制
char debugText [256];
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
fprintf ( dfile, "  err %d \n", errno);

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

那么到底是怎么回事呢?

EN

回答 4

Stack Overflow用户

发布于 2013-04-02 06:38:35

所有这些都告诉您,在fopen调用之后,errno的值是2。您不知道调用失败了,因为您没有检查dfile == NULL。如果输出实际上写入了文件,那么可能是fopen调用成功了,而errno值是前一个调用遗留下来的,很可能是您没有显式执行的调用。

失败的调用可以将errno设置为某个非零值,但成功的调用不会将errno设置为0。要检查错误,您需要

  • 在调用前将errno设置为0;
  • 进行调用并检查返回的值,以查看是否成功;
  • 在调用后检查errno的值--但前提是您知道它失败了(否则errno的值为

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

另一方面,您说dfileNULL。你怎么知道的?您的代码不会检查它。(如果fopen调用确实失败了,C:\List.txt的内容是否可以从您的程序的上一次运行中保留下来?)

你从这个程序中得到了什么输出?

代码语言:javascript
运行
复制
#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;
}
票数 12
EN

Stack Overflow用户

发布于 2013-04-02 06:34:14

代码语言:javascript
运行
复制
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中的这个值可能是从其他地方遗留下来的。

票数 7
EN

Stack Overflow用户

发布于 2013-04-02 06:51:08

任何库函数都不会将errno设置为零。

您应该仅在函数报告错误后才检查errno

例如,你的代码应该是:

代码语言:javascript
运行
复制
if ((dfile = fopen(debugText, "w")) == 0)
    ...then fopen() failed and errno is relevant...

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15753090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档