我不明白为什么这看起来会失败,错误号为2:
char debugText [256]; sprintf (debugText, "C:\\List.txt"); dfile = fopen( debugText, "w"); fprintf ( dfile, " err %d \n", errno);
我说表面上是因为当dfile为NULL时,文件被创建并填充了我的输出。到底是怎么回事?
5cnsuln71#
所有这一切告诉你errno在你调用fopen之后有值2。你不知道调用失败了,因为你没有检查dfile == NULL。如果输出实际上被写入文件,那么可能fopen调用成功了,errno值是从以前的某个调用遗留下来的,很可能你没有显式地进行。失败的调用可以将errno设置为某个非零值,但成功的调用 * 不会 * 将errno设置为0。
errno
fopen
dfile == NULL
如果defile == NULL,则fprintf调用具有未定义的行为;它可能会失败。另一方面,你说dfile就是NULL,你怎么知道的?你的代码没有检查它。(如果fopen调用确实失败了,C:\List.txt的内容会不会是上次运行程序时遗留下来的?)你从这个程序得到什么输出?
defile == NULL
fprintf
dfile
NULL
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; }
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中的这个值可能是其他值留下的。
fopen()
5kgi1eie3#
没有库函数会将errno设置为零。只有在函数报告错误后才应检查errno。例如,您的代码应该是:
if ((dfile = fopen(debugText, "w")) == 0) ...then fopen() failed and errno is relevant...
如果函数没有报错,那么errno中的值可能是任何值,例如在Solaris上,通常在操作成功后,errno设置为ENOTTY,因为stdout没有连接到终端,这并不意味着实际上出了问题;它只是意味着标准输出是否为终端的测试失败(因为它不是终端)。
ENOTTY
stdout
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(); }
koaltpgm5#
在我的情况下,我得到了errno == 2,而试图打开文件写入安装的闪存驱动器与FAT文件系统;结果是,如果文件不符合8.3 rule,fopen返回NULL,并将errno设置为ENOENT。不过有必要说,我在嵌入式系统上遇到了这种情况,它不应该是Windows上的问题。
errno == 2
ENOENT
5条答案
按热度按时间5cnsuln71#
所有这一切告诉你
errno
在你调用fopen
之后有值2。你不知道调用失败了,因为你没有检查dfile == NULL
。如果输出实际上被写入文件,那么可能fopen
调用成功了,errno
值是从以前的某个调用遗留下来的,很可能你没有显式地进行。失败的调用可以将
errno
设置为某个非零值,但成功的调用 * 不会 * 将errno
设置为0。errno
置0;errno
的值--但是 * 只有 * 在您知道它失败的情况下才检查(否则errno
的值是没有意义的)。如果
defile == NULL
,则fprintf
调用具有未定义的行为;它可能会失败。另一方面,你说
dfile
就是NULL
,你怎么知道的?你的代码没有检查它。(如果fopen
调用确实失败了,C:\List.txt
的内容会不会是上次运行程序时遗留下来的?)你从这个程序得到什么输出?
xkftehaa2#
以下是错误代码列表:
http://www.thegeekstuff.com/2010/10/linux-error-codes/
但是,您应该检查
fopen()
是否首先返回NULL
,因为errno
中的这个值可能是其他值留下的。5kgi1eie3#
没有库函数会将
errno
设置为零。只有在函数报告错误后才应检查
errno
。例如,您的代码应该是:
如果函数没有报错,那么
errno
中的值可能是任何值,例如在Solaris上,通常在操作成功后,errno
设置为ENOTTY
,因为stdout
没有连接到终端,这并不意味着实际上出了问题;它只是意味着标准输出是否为终端的测试失败(因为它不是终端)。wlzqhblo4#
仅写入文件名:像下面的例子对我来说很好:它将创建文件并写入用户输入的编号。
koaltpgm5#
在我的情况下,我得到了
errno == 2
,而试图打开文件写入安装的闪存驱动器与FAT文件系统;结果是,如果文件不符合8.3 rule,fopen
返回NULL
,并将errno
设置为ENOENT
。不过有必要说,我在嵌入式系统上遇到了这种情况,它不应该是Windows上的问题。