コース一覧
    C言語中級 連結リスト・応用
    エラーの調べ方

    C言語中級 連結リスト・応用

    C言語の連結リストと応用的なデータ操作を学び、実装でデータを扱うコースです。

    1
    連結リスト
    01. 配列の限界15分
    02. ノードを定義する15分
    03. 先頭に追加する15分
    04. リストを歩く15分
    05. 任意位置の挿入と削除15分
    06. リストを全解放する15分
    07. つくる リスト版成績管理15分
    08. 第5章クイズ10分
    2
    応用
    01. 動的な二次元配列15分
    02. コマンドライン引数15分
    03. バイナリ保存15分
    04. エラーの調べ方15分
    05. つくる 引数とバイナリ保存15分
    06. 第6章クイズ10分
    3
    総合制作
    01. リスト版を完成させる20分
    02. メモリバグ演習20分
    03. 自由拡張20分
    04. 完成と次のステップ10分

    エラーの調べ方

    失敗したことは分かる。理由が分からない

    fopen が NULL を返したとき、分かるのは「開けなかった」ことだけです。ファイルが無いのか、名前を打ち間違えたのか、読む権限が無いのか、開きすぎて上限に達したのか。これを区別できないと、利用者に出せるのは「開けませんでした」という役に立たない一言だけになります。

    C は戻り値を1つしか返せないので、失敗の理由は別の場所に置かれます。それが errno です。

    errno は「直前の失敗の理由」が入る場所

    errno.h を include すると errno が使えます。標準ライブラリの関数は、失敗したときにここへ理由を表す番号を入れます。番号には名前が付いていて、よく出会うのは次のものです。

    • ENOENT そんなファイルやディレクトリは無い
    • EACCES 権限が無い
    • EEXIST すでにある
    • ENOMEM メモリが足りない

    malloc が NULL を返したときも ENOMEM が入ります。

    扱いで大事なきまりが2つあります。1つめは、成功したときに errno がゼロに戻る保証は無い ことです。前の失敗の値が残っていることがあるので、errno を見てよいのは「戻り値で失敗を確かめたあと」だけです。2つめは、確かめたい呼び出しの直前に errno = 0; と自分で消しておくことです。間に別の関数を挟むと、そちらの失敗で上書きされます。

    c

    errno = 0;
    FILE *fp = fopen(name, "r");
    if (fp == NULL) {
        if (errno == ENOENT) {
            printf("ファイルが見つかりません\n");
        }
    }

    perror と strerror

    番号のまま出しても人には読めません。文にしてくれる道具が2つあります。

    c

    perror("fopen");                       /* fopen: No such file or directory */
    printf("%s\n", strerror(errno));       /* No such file or directory */

    perror は渡した文字列と理由をつないで 標準エラー出力 に出します。標準出力とは別の流れなので、画面には出ても、パイプでつないだ先には流れません。この教材の採点は標準出力だけを見るため、perror で書いたものは答え合わせに使えません。判定に出したい文は printf で出し、perror は開発中の手がかりとして使い分けます。

    strerror は理由の文を文字列で返すので、こちらは printf に混ぜられます。ただし返ってくる文は英語で、環境によって言い回しが変わります。利用者に見せる文を自分の言葉で書きたいときは、このレッスンのように errno の値で分岐します。

    では、開けなかった理由を具体的に伝えるプログラムを書いてみましょう。

    要件

    1. 開けたときは scores.txtを開きました と 点数は80点です の2行を出す
    2. 開けなかったときは missing.txtを開けませんでした と 理由はファイルが見つからないことです の2行を出す
    3. 理由の判定には errno を使い、ENOENT のときだけ ファイルが見つからない と言い切る
    4. fopen を呼ぶ直前に errno を 0 にしておく

    ヒント

    errno を見てよいのは、戻り値が NULL だと確かめたあとだけです。成功時に 0 に戻る保証はありません

    perror は標準エラー出力に出るので、判定用の文は printf で出します

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • つくる 引数とバイナリ保存

      起動と保存を実用的な形にできるようになります。

    • 第6章クイズ

      二次元確保、引数、バイナリ保存の理解を確認します。

    • リスト版を完成させる

      全機能をリスト前提で1本にまとめられるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 戻り値呼び出し元への返答を表す点線矢印
    • 標準ライブラリPythonに同梱の公式モジュール群
    • 関数処理に名前を付けて再利用できる単位
    • ディレクトリファイルを整理するフォルダのこと。
    • メモリプログラムとデータを一時保持する高速領域
    • パイプコマンドの結果を次のコマンドに渡す
    main.c
    エディタを読み込んでいます

    メモ

    エラーの調べ方

    ⌘S で保存