C fopen写入失败,错误号为2

5m1hhzi4  于 2023-01-08  发布在  其他
关注(0)|答案(5)|浏览(353)

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

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

我说表面上是因为当dfile为NULL时,文件被创建并填充了我的输出。
到底是怎么回事?

5cnsuln7

5cnsuln71#

所有这一切告诉你errno在你调用fopen之后有值2。你不知道调用失败了,因为你没有检查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;
}
xkftehaa

xkftehaa2#

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中的这个值可能是其他值留下的。

5kgi1eie

5kgi1eie3#

没有库函数会将errno设置为零。
只有在函数报告错误后才应检查errno
例如,您的代码应该是:

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

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

wlzqhblo

wlzqhblo4#

仅写入文件名:像下面的例子对我来说很好:它将创建文件并写入用户输入的编号。

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
void main() {
    int num;
   FILE *fptr;
   clrscr();
   fptr = fopen("num.txt","w");

   if(fptr == NULL)
   {
     fprintf(stderr,"open error for %s,errno = %d: %s\n",fptr, errno, strerror(errno));
     printf("Error!");
     exit(1);
   }

   printf("Enter num: ");
   scanf("%d",&num);

   fprintf(fptr,"%d",num);
   fclose(fptr);

   getch();

}
koaltpgm

koaltpgm5#

在我的情况下,我得到了errno == 2,而试图打开文件写入安装的闪存驱动器与FAT文件系统;结果是,如果文件不符合8.3 rulefopen返回NULL,并将errno设置为ENOENT
不过有必要说,我在嵌入式系统上遇到了这种情况,它不应该是Windows上的问题。

相关问题