什么样的库函数面临什么样的错误会影响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;
}