Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のエラー処理とは?ferror・perror・feof関数の使い方を解説

C言語でファイル操作を行う際には、さまざまなエラーが発生する可能性があります。エラー処理を適切に行うことで、プログラムの信頼性と安定性を高めることができます。

ファイル操作で発生しやすい主なエラー

  • ファイルの終端(EOF)を超えて読み込もうとした場合
  • デバイスオーバーフローが発生した場合
  • 存在しないファイルなど、無効なファイルを開こうとした場合
  • 異なるモードで開いたファイルに対して無効な操作を実行した場合

エラー処理に使われる主な関数

C言語には、ファイル関連のエラーを検出したり表示したりするための標準ライブラリ関数が用意されています。代表的なのは以下の3つです。

  • ferror( )
  • perror( )
  • feof( )

ferror( )関数

ferror( )は、ファイルへの読み書き操作中にエラーが発生したかどうかを検出するための関数です。

構文は次のとおりです。

int ferror(FILE *fp);

使用例:

FILE *fp;
if (ferror(fp))
    printf("エラーが発生しました");

この関数は、エラーがなければ0を返し、エラーが発生した場合は0以外の値を返します。

perror( )関数

perror( )は、エラーの内容を出力するための関数です。引数として渡した文字列に続き、コロン(:)と空白、さらに現在のエラー値を表すテキストが表示されます。

構文は次のとおりです。

perror(str);

使用例:

FILE *fp;
char str[30] = "Error is";
perror(str);

出力結果

Error is: error 0

ferror( )とperror( )を使ったサンプルプログラム

次の例は、ferror( )perror( )を使って、読み取り専用モードで開いたファイルへの書き込みエラーを検出するCプログラムです。

#include <stdio.h>

int main(void){
    FILE *fp;
    char str[30] = "error is";
    int i = 20;

    fp = fopen("sample.txt", "r");
    if (fp == NULL){
        printf("ファイルが存在しません\n");
    } else {
        fprintf(fp, "%d", i);   /* 読み取りモードのため失敗する */
        if (ferror(fp)){
            perror(str);
            printf("エラー\n");
        }
        fclose(fp);
    }
    return 0;
}

出力結果

上記のプログラムを実行すると、次のように表示されます。

Error is: Error1 compiler generated.
エラー

feof( )関数

feof( )は、ファイルの終端(EOF)に達したかどうかを判定するための関数です。

構文は次のとおりです。

int feof(FILE *fp);

使用例:

FILE *fp;
if (feof(fp))
    printf("ファイルの終端に到達しました");

ファイルの終端に達していれば0以外の値を返し、まだであれば0を返します。

feof( )を使ったサンプルプログラム

次の例は、feof( )を使ってファイルの終端を検出しながら数値データを読み出すCプログラムです。

#include <stdio.h>

int main(void){
    FILE *fp;
    int i, n;

    fp = fopen("number.txt", "w");
    for (i = 10; i <= 100; i += 10){
        putw(i, fp);
    }
    fclose(fp);

    fp = fopen("number.txt", "r");
    printf("ファイルの内容:\n");
    while (1){
        n = getw(fp);
        if (feof(fp)){
            printf("\nファイルの終端に到達しました\n");
            break;
        } else {
            printf("%d ", n);
        }
    }
    fclose(fp);
    return 0;
}

出力結果

上記のプログラムを実行すると、次のように表示されます。

ファイルの内容:
10 20 30 40 50
60 70 80 90 100
ファイルの終端に到達しました。

  1. C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説

    問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ

  2. C言語の探索アルゴリズム解説|線形探索と二分探索の違いと実装例

    探索(サーチ)とは、複数の要素で構成されるリストの中から、目的の「キー」となる要素を見つけ出す処理のことです。 リストの中に指定した要素が存在すれば、その探索は「成功」とみなされます。 指定した要素がリストに存在しなければ、その探索は「失敗(不成功)」となります。 C言語で広く使われている代表的な探索手法は、主に次の2つです。 線形探索(Linear Search/リニアサーチ) 二分探索(Binary Search/バイナリサーチ) 線形探索(Linear Search)とは 線形探索は、リストの先頭から順に要素を1つずつ取り出し、キーと一致するかどうかを確認していく、最も基本的な探