どの種類のライブラリ関数が直面するどの種類のエラーがerrnoに影響し、ゼロ以外の値に設定されますか? if(errno!=0)
次のプログラムでは、使用したライブラリ関数が正しく機能するかどうかを確認するための条件として使用するつもりでした。これが私が見つけたものです (以下のコードを参照)。
最初にif(errno!=0)
、ファイルが正常に開かれたかどうかをテストしていましたfopen()
。存在しないファイルを開こうとすると、ゼロ以外 (私の場合は 2) に設定され、各段階でerrno
の値を出力することで検証されます。ただし、既存のファイルを開くと、ファイルが適切に開かerrno
れるため、errno の値はゼロのままです。fopen()
この問題では、私がコメントしif(errno!=0)
た完全な代替品として機能します。if(pFile==NULL)
ファイルが正常に開かれた場合、errno
まだ0
で、コントロールは最初のelse
ブロックに移動します。ここで、 の動作について混乱が見られますerrno
。ここでは、ファイルをr(read)モードで開き、 を使用して書き込みを試みたので、ファイルを正常に開けなかったときに設定されたのと同じように、結果の書き込みエラーがゼロ以外fputc()
に設定されることを期待しています。 . しかし、を使用した書き込みに失敗した後でも、 の値はゼロのままです。(これは、誤った書き込みの後に の値を出力することで確認できます)。errno
fopen()
errno
fputc()
errno
なぜそうなのですか?I/O エラーが 1 つの関数fopen()
設定で直面しているのにerrno
、他の関数で直面している書き込みエラーがfputc()
影響していないのはerrno
なぜですか? もしそうなら、どうすればerrno
エラーの指標として確実に使用できますか? 「if(pFile==NULL)」の代わりに、fopen() が正常に機能したかどうかをテストするために errno を使用するのは賢明ではないですか? これに対するあなたの分析的な回答に感謝します。
#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;
}