ファイル操作

次にテキストファイルの読み込み操作を見ていきます。

 

読み込み処理の例題1

この例題では
asset/sample.txt の内容を一行ずつ読み込んで文字列に詰め、詰め込んだ内容を表示する
という事を行います。

sample.txt の内容は下記の様にします。

sample.txt

abcdef

大まかな手順は下記のとおりです。

 

  1.  fopen_s 関数で指定したファイルを指定したモードで開き、変数fpで操作できるようにする
  2.  fgets 関数で内容を一行ずつ読み取っていき、buffer に詰めてコンソールに表示する
  3.  fclose 関数でファイルを閉じる
#include 

// エントリー関数
int main(void)
{
    // ファイル構造体を扱うポインタ変数宣言
    FILE* fp = NULL;

    // プロジェクトからの相対パスで asset/sample.txt を読込モードで開く
    // 開くことに失敗した場合は、エラーを表示する
    if (0 == fopen_s(&fp, "asset/sample.txt", "r"))
    {
        // 読込先の文字配列
        char buffer[256] = {};

        // fgets で一行毎に文字を配列に詰め込む
        while (NULL != fgets(buffer, 256, fp))
        {
            // 詰め込んだ内容を表示する
            printf("%s", buffer);
        }

        // 閉じる
        fclose(fp);
    }
    else 
    {
        printf("ファイルがありません\n");
    }

    return 0;
}

順にみていきましょう。

 

①fopen_s 関数で指定したファイルを指定したモードで開き、変数fpで操作できるようにする

下記コードがその個所となります。

    // ファイル構造体を扱うポインタ変数宣言
    FILE* fp = NULL;

    // プロジェクトからの相対パスで asset/sample.txt を読込モードで開く
    // 開くことに失敗した場合は、エラーを表示する
    if (0 == fopen_s(&fp, "asset/sample.txt", "r"))

読み込みなので、モードは「r」を指定しています。
サンプルでは失敗した場合の対応も行っています。

 

② fgets 関数で内容を一行ずつ読み取っていき、buffer に詰めてコンソールに表示する

下記コードがその個所となります。

        // 読込先の文字配列
        char buffer[256] = {};

        // fgets で一行毎に文字を配列に詰め込む
        while (NULL != fgets(buffer, 256, fp))
        {
            // 詰め込んだ内容を表示する
            printf("%s", buffer);
        }

読み取り開始の現在位置はfpが持ち、fgets 関数が成功すると、
読み取った分だけ、変数fpが持つ読み取り開始の位置を進めてくれます。
その為、戻り値が NULL (EOFに到達 or 読み取りに失敗)になるまで、
while で読み取りを繰り返すといった事が可能になります。

 

③ fclose 関数でファイルを閉じる

下記コードがその個所となります。

        // 閉じる
        fclose(fp);

ファイルは使い終わると必ず fclose で閉じるようにしてください。

 

読み込み処理の例題2

この例題では
asset/sample.txt の内容を指定のフォーマットに合わせて読み取り、変数に詰め込んだ内容を表示する
という事を行います。

sample.txt の内容は下記の様にします。

sample.txt

1 aaaa 1.7 3 bbb 3.4 

大まかな手順は下記のとおりです。

 

  1.  fopen_s 関数で指定したファイルを指定したモードで読み込み、変数fpで操作できるようにする
  2.  fscanf_s 関数で指定したフォーマットで内容を読み取り、各変数に詰めてコンソールに表示する
  3.  fclose 関数でファイルを閉じる
#include 

// エントリー関数
int main(void)
{
    FILE* fp = NULL;

    // プロジェクトからの相対パスで asset/sample.txt を読込モードで開く
    // 失敗した場合はエラー表示
    if (0 == fopen_s(&fp, "asset/sample.txt", "r"))
    {
        // 読込先の整数変数
        int no = 0;
        // 読込先の文字配列
        char string[256] = {};
        // 読込先の浮動小数変数
        float value = 0;

        // fscanf_s でフォーマットを指定して読み取る
        while (EOF != fscanf_s(fp, "%d %s %f ", &no, string, 256, &value))
        {
            // 読み込んだ内容を表示する
            printf("%d,%s,%1.2f\n", no, string, value);
        }

        // 閉じる
        fclose(fp);
    }
    else 
    {
        printf("ファイルがありません");
    }

    return 0;
}

①と③は同じである為割愛します。

 

②fscanf_s 関数で指定したフォーマットで内容を読み取り、各変数に詰めてコンソールに表示する

下記コードがその個所となります。

        // 読込先の整数変数
        int no = 0;
        // 読込先の文字配列
        char string[256] = {};
        // 読込先の浮動小数変数
        float value = 0;

        // fscanf_s でフォーマットを指定して読み取る
        while (EOF != fscanf_s(fp, "%d %s %f ", &no, string, 256, &value))
        {
            // 読み込んだ内容を表示する
            printf("%d,%s,%1.2f\n", no, string, value);
        }

fscanf_s 関数で注目するべきは第二引数以降です。
第二引数で、読み取るテキストのフォーマットをそれぞれ指定します。
第三引数以降で、フォーマットに対応した型の変数のアドレスを指定します。
文字列として変数に受け取る際は、受け取る文字列の最大数も指定する必要があります。

どのフォーマットがどんな構成でテキストファイルに入っているのかを、
正しく把握しておかなければならない点に注意してください。

読み取った分だけ、fpが持つ読み取り開始の位置を進めてくれます。
戻り値はファイルの終端であれば EOF それ以外は読み取った個数になります。

1 2 3 4 5

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です