我不明白为什么这似乎失败了,错误号为 2:
char debugText [256];
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
fprintf ( dfile, " err %d \n", errno);
我说似乎是因为当 dfile 为 NULL 时,文件被创建并充满了我的输出。
所以这是怎么回事?
所有这一切都告诉你,
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;
}
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
中的这个值可能是其他东西遗留下来的。
没有库函数将
errno
设置为零。
您应该只在函数报告错误后检查
errno
。
例如你的代码应该是:
if ((dfile = fopen(debugText, "w")) == 0)
...then fopen() failed and errno is relevant...
如果函数不报错,则
errno
中的值可以是任何值。例如,在 Solaris 上,您通常在成功操作后将 errno
设置为 ENOTTY
,因为 stdout
未连接到终端。这并不意味着实际上出了什么问题;它只是意味着测试标准输出是否是终端失败(因为它不是终端)。
只写文件名: 像下面的例子对我来说很好用: 它将创建文件并在其中写入用户输入的数字。
#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();
}
在我的例子中,我在尝试打开文件以在具有 FAT 文件系统的已安装闪存驱动器上写入时得到了
errno == 2
;事实证明,如果文件不符合8.3规则,fopen
返回NULL
并将errno
设置为ENOENT
。
不得不说,我在嵌入式系统上遇到过这种情况,它应该不是Windows上的问题。