「C言語」の「ファイル操作の仕組み」とプログラムの書き方を学ぼう!

今回は、「C言語」で「ファイル操作」を行う方法について学んでいきたいと思います。

データの「保存」と「取得」ができるようになると、作成できるアプリケーションの幅も広がりそうです。

それでは、「ファイル操作」の方法について学んでいきましょう。

ファイル操作の方法

「C言語」でファイルを操作するためには、まず「fopen」関数でファイルを開く必要があります。

そして、開いたファイルに「読み込み」や「書き込み」を行い、最後に「ファイルを閉じる」操作を行う必要があります。

「fopen」関数

ファイルを開くためには、「fopen」関数を利用しますが、この関数は、

FILE型のポインタ = fopen("ファイル名","ファイルを開くモード");

のように利用していきます。

「ファイルを開くモードって何?」ってなったので、調べてみました。

まず、「読み込み」を行うためには「r」を指定するそうで、「書き込み」を行うためには、「w」または「a」を指定するとのこと。

「w」は「新規作成」で、「a」は「ファイルへの追記」に利用するそうです。

まず、読み込むデータを用意したいと思います。

今回は「data.txt」というファイルを作り、その中に、

data1
data2
data3

というテキストを作成しました。

このデータを「読み込み」モードで開くプログラムは、

#include <stdio.h>

int main(void) {

    // ファイルを開く
    FILE *fpointer = fopen("data.txt","r");

    return 0;
}

のようになります。

もう一つわからなかったのが、「fopen」関数の「戻り値」の「FILE型の変数」の中身です。

これは「FILE構造体」という構造体を表していて、そのポインタを格納するための変数を用意しているそうです。

開いたファイルにアクセスするための情報」が入っているんですね。

「fclose」関数

「開いたファイル」を利用し終わったら、「ファイルを閉じる」ことが必要です。

「fclose」関数を利用すると、「開いたファイル」を閉じることができます。

使い方は、

fclose(ファイル型構造体のポインタ)

のようになります。

ファイルを開いて閉じるだけの単純なプログラムは、

#include <stdio.h>

int main(void) {

    // ファイルを開く
    FILE *fpointer = fopen("data.txt","r");
    
    // ファイルを閉じる
    flose(fpointer);

    return 0;
}

のようになります。

「fgets」関数

ファイルの内容を読み取るためには、「fgets」関数を利用していきます。

この関数は、「ファイル内のデータ」の「1行分」のデータを読み取ってくれます。

通常は「while」文と組み合わせて利用することが多いそう。

「fgets」関数を利用するためには、

fgets(読み込んだデータを格納する変数(文字列型の配列), 読み込むデータの最大文字数, 読み込む対象);

のように書いていきます。

ファイルのデータを読み込んで、データを出力するプログラムを作ってみると、

#include <stdio.h>

int main(void) {

    char data[2048];

    // ファイルを開く
    FILE *fpointer = fopen("data.txt","r");

    // ファイルを開けているかを確認
    if( fpointer == NULL ){
    	printf("ファイルが開けません。");
    } else {
    	// ファイルの読み込み処理
        while( fgets(data, 256, fpointer) != NULL){
            printf("%s\n", data);
        }
    }

    fclose(fpointer);

    return 0;
}

のようになります。

「while」文では、「fgets」関数の戻り値が「NULL」かどうかをチェックしています。

「NULL」が返ってきたら「ファイルの最後まで読み込み終了」ということみたいなので、「while」文を抜けるという仕組みなんですね。

なかなか複雑な手順に感じます・・・

「fprintf」関数

ファイルにデータを書き込むためには「fprintf」関数を利用していきます。

「fprintf」関数は、

fprintf(FILE型の変数, 書き込むデータ);

のように書いていきます。

データを追加して、表示するプログラムを作ってみました。

#include <stdio.h>

int main(void) {

    char data[2048];

    // ファイルを開く
    FILE *fpointer = fopen("data.txt","a");

    // ファイルを開けているかを確認
    if( fpointer == NULL ){
    	printf("ファイルが開けません。");
    } else {
    	// ファイルの書き込み処理(書き込みモード
        int result = fprintf(fpointer, "data\n");

        if( result == -1 ){
            printf("ファイルの書き込みに失敗しました。");
        } else {
            fclose(fpointer);

            // ファイルの読み込み処理
            FILE *fpointer = fopen("data.txt","r");
            while( fgets(data, 256, fpointer) != NULL){
                printf("%s\n", data);
            }
        }
    }

    fclose(fpointer);

    return 0;
}

のようになります。

「fprintf」関数は、ファイルの書き込みに失敗すると、「-1」が返ってくるのですが、何回も「-1」が返ってきてしまって、プログラムを書くのにハマってしまい、半日くらい悩みました・・・

「読み込みモード」と「書き込みモード」が別なのを忘れてしまい、そのまま「fpointer」関数を利用してしまって、データ表示ができなかったり、ファイルの保存場所が思っていたところと違っていて、ファイルが読み込めなかったりとめっちゃ悩みました。

でも、これで、「データ表示」と「データ書き込み」ができるようになりました。

といっても、まだまだ基本的な機能についてしか学んでいないので、もっといろいろな機能ついて勉強して、ファイルを利用したアプリケーションを作れるようになっていけたらなと思っています。

→(前へ)「C言語」の「マクロ」「プロプロセッサ」「列挙型」を学ぶ

→(次へ)「C言語」の「文字列操作関数」が難解だった・・・

→「Twitter:@satoru78888」

HOMEへ