Shammer's Philosophy

My private adversaria

perror 関数

先日書いた(というか引用した)サンプルで使ったことなかった記述があったのでそのメモ。perror という関数。エラーメッセージは、いつも単に printf で標準出力に出していたが、こういう関数も使用できるようだ。以下のリンクが見つかった。

 perror

引用。

【書式】
#include <stdio.h>
void perror(const char *str); 

【説明】
標準エラー出力デバイス stderr に対して、エラーメッセージ str とerrnoに対応するシステムエラーメッセージを出力します。
使用例を見ていただくとわかると思いますが、出力は、「str文字列: errnoに対応するシステムエラーメッセージ」となります。ただし、str にNULLを指定した場合と、*strが空文字の場合には、「errnoに対応するシステムエラーメッセージ」のみを出力します。
また、errnoは一部のライブラリ関数によってエラー発生時に設定される値です。errno は errno.h に宣言されています。

【引数】
const char *str : 出力文字列

簡単に言うと、

  • システム標準のエラーメッセージに何か追記したい場合に使用する関数
  • エラー発生時に自分でメッセージ内容を考えるのが面倒なのでシステム標準のものを使用したいが、そのメッセージ内容が定かでない場合に使用する関数(この場合はメッセージ内容にNULLを渡す)

ということになるだろうか。

引用もとにもサンプルはあるが、引用もとのやつだと第一引数に渡すファイルが存在しない場合には2つ目の fopen が実行されないのでちょっとだけ変更。

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
        FILE *fp1, *fp2;
        int c;

	if( argc == 2 ) {
	    if((fp1 = fopen(argv[1], "r")) == NULL ) {
                perror("入力ファイル");
                exit(EXIT_FAILURE);
	    }
	}
	else if ( argc == 3 ) {
	    if((fp2 = fopen(argv[2], "r")) == NULL ) {
                perror(NULL);
                exit(EXIT_FAILURE);
	    }
	}
	else {
	    printf("Usage: argv[0] $1 $2");
	    return 1;
	}
        
        fclose(fp1);
        fclose(fp2);

        return 0;
}

EXIT_FAILURE は、エラー発生時に勝手に定義してくれるようだ。