😽

fgetsで複数行のファイルを読み取る

2021/01/07に公開

fgets()でファイルの中身を読み取る。ただし複数行あっても読み取れるようにしたい。

fgets関数は

  • 第1引数 char *: ファイルから読み取る文字列をstoreするcharacter pointer
  • 第2引数 int: ファイルから読み取る文字列の最大の長さ
  • 第3引数 FILE *: ファイルストリームのポインタ。stdinでもよい。

fgets関数の挙動として

  • 改行
  • EOF

に到達すると文字列のscanが停止する。このため、素朴にfgetsのみ利用すると、一行しか読み取られない。

これを考慮すると、whileループを併用することになる。

そして、行ごとに読み取る時の注意点としては、fgetsの挙動として最終行に\nが差し込まれるのでそれを主導で取り除いてやる必要がある。

これは、ファイルの最後の行以外で起こるということも考慮する。

コードは以下。

#include <stdio.h>
#include <string.h>

#define MAX_LINE_LENGTH 20

int main () {
    FILE *fp;
    char str[100];

    fp = fopen("file.txt", "r");
    if(fp == NULL){
        perror("error opening file\n");
        return 0;
    }

    int l = 0;
    while (fgets(str, MAX_LINE_LENGTH, fp) != NULL) {

        // need to check if the last character is \n and
        if(*str && str[strlen(str) - 1] == '\n'){
            str[strlen(str) - 1] = 0;
        }
        printf("%d: %s\n", l, str);
        l++;
    }

    fclose(fp);

    return 0;
}

読み取り対象のファイルを以下のようにする。

file.txtの中身を以下のようだとする

hogehoge11
hogehoge22
hogehoge33

出力。

参考

Discussion