C fopen 写入失败,errno 为 2

问题描述 投票:0回答:5

我不明白为什么这似乎失败了,错误号为 2:

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

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

所以这是怎么回事?

c fopen errno
5个回答
15
投票

所有这一切都告诉你,

errno
在你的
fopen
调用后的值为 2。你不知道调用失败了,因为你没有检查是否
dfile == NULL
。如果输出实际上写入了文件,那么
fopen
调用可能成功并且
errno
值是之前某个调用遗留下来的,可能是您没有明确进行的调用。

调用

fopen
成功完全有可能将
errno
设置为非零值

失败的调用可以将

errno
设置为某个非零值,但成功的调用don't
errno
设置为0。要检查错误,您需要

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

如果

dfile == 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;
}

9
投票
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
中的这个值可能是其他东西遗留下来的。


5
投票

没有库函数将

errno
设置为零。

您应该只在函数报告错误后检查

errno

例如你的代码应该是:

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

如果函数不报错,则

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


3
投票

只写文件名: 像下面的例子对我来说很好用: 它将创建文件并在其中写入用户输入的数字。

#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();

}


1
投票

在我的例子中,我在尝试打开文件以在具有 FAT 文件系统的已安装闪存驱动器上写入时得到了

errno == 2
;事实证明,如果文件不符合8.3规则
fopen
返回
NULL
并将
errno
设置为
ENOENT

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

© www.soinside.com 2019 - 2024. All rights reserved.