C400

22. エラー処理入門 perror と strerror

サンプル・ソースを最初に眺めたときに

perror("cannot open file");

などという記述を目にすると

printf("cannot open file\n");

とどのように違うのかと思うことがあるかも知れない。

printf の場合は 単なる標準出力 であるがperrorシステム・エラー・メッセージを伴う

エラー・メッセージ
である。

例えばファイル・オープンに失敗した場合、単に

printf("cannot open file\n");

では真の原因が不明である。

  • オープンするファイルが見つからない
  • ファイル名の指定が正しくない。
  • ファイルをオープンする権限が無い。

などと原因はさまざまであるからである。

このようなときには

perror("cannot open file"); 

perror を使って記述しておくと

                 cannot open file ファイルが見つかりません。

のようにシステムからのメッセージを伴って出力することができるので、真の原因を直ちに知ることができる。

このように perror が有効であることを知るともう少しユーザーでメッセージを書式化して出力したくなる。

つまり「ファイルが見つかりません。」というシステム・メッセージだけを取り出したい要求が出てくる。

例えば標準出力ではなくPCクライアントにエラーの内容を送信したい場合などがその例である。

このような場合には strerror(errno) によってシステム・エラー・メッセージだけを取り出すこと

ができる。ただしシステム・エラー・メッセージは CPFxxxx という例の詳細なメッセージではないことに注意。

下記に使用例を示す。

0001.00 #include <stdio.h>
0002.00 #include <stdlib.h>
0003.00 #include <string.h>
0004.00 #include <errno.h>
0005.00
0006.00 #define TRUE         0
0007.00 #define FALSE       -1
0008.00
0009.00 void main(void){
0010.00     FILE *stream;
0011.00     char buff[132];
0012.00
0013.00     if((stream = fopen("QGPL/MYFILE", "r")) == NULL){
0014.00        sprintf(buff, "ERR%d = %s\n", errno, strerror(errno));
0015.00        printf("%s\n", buff);
0016.00     }
0017.00     getchar();
0018.00 }
【 解説 】

この例では

                 ERR3101 =  回復可能でない入出力エラーが起こった

と出力される。