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

C言語でfwrite()/fread()を使って構造体をファイルに読み書きする方法


C言語では、標準ライブラリのfwrite()関数とfread()関数を使うことで、構造体(struct)のデータをそのままファイルへ書き込んだり、ファイルから読み込んだりできます。これらの関数はデータをバイナリ形式で扱うため、構造体内の値を効率よく入出力できるのが大きな特徴です。

fwrite() の構文

fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

各引数の意味は次の通りです。

ptr … 書き込む要素が格納された配列へのポインタ

size … 書き込む各要素のサイズ(バイト単位)

nmemb … 書き込む要素の個数

stream … 出力ストリームを指定する FILE オブジェクトへのポインタ

fread() の構文

fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

各引数の意味は次の通りです。

ptr … 読み込んだデータを格納するメモリブロックへのポインタ(最低でも size × nmemb バイトの領域が必要)

size … 読み込む各要素のサイズ(バイト単位)

nmemb … 読み込む要素の個数

stream … 入力ストリームを指定する FILE オブジェクトへのポインタ

処理の流れ(アルゴリズム)

開始
    変数を宣言するための構造体 Student を定義する。
    書き込み用にファイルを開く。
    ファイルを開く際にエラーが発生していないか確認する。
    変数にデータを設定する。
    ファイルが正常に開けたら、fwrite() で構造体を書き込む。
        書き込み用のファイルを閉じる。
    読み込み用に同じファイルを開く。
    ファイルを開く際にエラーが発生していないか確認する。
    ファイルが正常に開けたら、fread() でデータを読み込む。
        読み込み用のファイルを閉じる。
    エラーが発生していないか確認する。
    読み込んだデータを表示する。
終了。

それでは、C言語で構造体をファイルに読み書きする具体的な例を見ていきましょう。

サンプルコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
    int roll_no;
    char name[20];
};
int main () {
    FILE *of;
    of= fopen ("c1.txt", "w");
    if (of == NULL) {
        fprintf(stderr, "\nError to open the file\n");
        exit (1);
    }
    struct Student inp1 = {1, "Ram"};
    struct Student inp2 = {2, "Shyam"};
    fwrite (&inp1, sizeof(struct Student), 1, of);
    fwrite (&inp2, sizeof(struct Student), 1, of);
    if(fwrite != 0)
        printf("Contents to file written successfully !\n");
    else
        printf("Error writing file !\n");
    fclose (of);
    FILE *inf;
    struct Student inp;
    inf = fopen ("c1.txt", "r");
    if (inf == NULL) {
        fprintf(stderr, "\nError to open the file\n");
        exit (1);
    }
    while(fread(&inp, sizeof(struct Student), 1, inf))
        printf ("roll_no = %d name = %s\n", inp.roll_no, inp.name);
    fclose (inf);
}

コードの解説

まず、学籍番号(roll_no)と名前(name)を持つ struct Student を定義します。続いて、ファイル「c1.txt」を書き込みモード("w")で開き、オープンに失敗した場合は fprintf(stderr, ...) でエラーメッセージを表示してプログラムを終了します。

書き込み側では、fwrite() を使って構造体変数 inp1inp2 の内容をそれぞれ1件ずつファイルに書き込みます。sizeof(struct Student) を渡すことで、構造体全体のサイズが自動的に計算される点がポイントです。

読み込み側では、同じファイルを読み込みモード("r")で開き、fread() の戻り値が0になるまでwhileループで繰り返し読み込むことで、ファイル内の全レコードを順番に取得して表示します。なお、より厳密には fwrite() の戻り値(実際に書き込めた要素数)を判定してエラーをチェックするのが安全な書き方です。

実行結果

Contents to file written successfully !
roll_no = 1 name = Ram
roll_no = 2 name = Shyam

このように、fwrite()fread() を組み合わせれば、構造体単位でデータを保存・復元でき、簡易的なデータベースのような処理も簡単に実装できます。


  1. PythonのopenpyxlモジュールでExcelファイルを読み書きする方法【初心者向け完全ガイド】

    Pythonには、Excelファイル(.xlsx)を操作するためのopenpyxlという便利なモジュールが用意されています。このモジュールを使えば、Excelファイルの新規作成、データの書き込み・読み取り、シートの追加や管理など、さまざまな操作をプログラムから自動的に行うことができます。 本記事では、openpyxlの基本的な使い方を、実際に動作するサンプルコードとともに順番に解説していきます。 openpyxlのインストール方法 openpyxlは標準ライブラリではないため、まずインストールが必要です。コマンドプロンプト(またはターミナル)で以下のコマンドを実行してください。 pip ins

  2. Rubyでファイルを読み書きする方法を実例つきで徹底解説

    Rubyでファイルの読み書きができるようになると、ファイルからデータを抽出したり、新しいファイルを作成したり、必要な情報を素早く見つけたりできるようになります。この記事では、Rubyにおけるファイル操作の基本を、実際のコード例とともにわかりやすく解説します。 この記事で学べること Rubyでファイルを読み込む方法 Rubyでファイルに書き込む方法 覚えておきたいFileクラスのメソッド ディレクトリ操作の基礎 FileUtilsモジュールの使い方 まとめ それでは始めましょう! Rubyでファイルを読み込む方法 Rubyでファイルを読み込む基本的な流れは、次の3ステップです。 op