什么样的库函数面临什么样的错误会影响errno并将其设置为非零值?在我的以下程序中,我打算if(errno!=0)
用作检查我使用的库函数是否正常运行的条件,这就是我发现的(见下面的代码):
首先,我曾经if(errno!=0)
测试文件是否已成功打开fopen()
。如果我尝试打开一个不存在的文件,则errno
设置为非零(在我的情况下为 2),并通过打印errno
每个阶段的值来验证。但是,如果我打开一个现有文件,则 errno 的值将保持为零,因为fopen()
可以正确打开该文件。在这件事上,if(errno!=0)
作为if(pFile==NULL)
我已经注释掉的完美替代品。
如果文件被成功打开,errno
仍然0
,控制移动到第一个else
块。这是我对errno
. 在这里,由于我以r(read)模式打开文件并尝试使用 写入文件,因此fputc()
我希望生成的写入错误设置errno
为非零,就像fopen()
它无法成功打开文件时设置的那样. 但是errno
即使在使用fputc()
. errno
(这可以通过打印错误写入后的值来验证)。
为什么会这样?为什么一个函数面临的 I/O 错误fopen()
设置errno
其他函数面临的 while write 错误fputc()
不影响errno
?如果是这样,我们如何可靠地errno
用作错误指标?我是否使用 errno 来测试 fopen() 是否成功运行,而不是“if(pFile==NULL)”不明智?我将感谢您对此的分析回答。
#include <stdio.h>
#include <errno.h>
int main ()
{
FILE * pFile;
printf("%d\n",errno);
pFile = fopen("D:\\decrypt.txt","r");
printf("%d\n",errno); // Prints 0 if fopen() successful,else 2
//if(pFile==NULL) perror("Error opening file");
if (errno!=0) perror ("Error opening file");
else
{
fputc ('x',pFile);
printf("%d\n",errno); //errno shows 0 even after write error
//if (ferror (pFile))
if (errno!=0) //Condition evaluates false even if faulty write
{
printf ("Error Writing to decrypt.txt\n");
}
fclose (pFile);
}
return 0;
}