メイン画像

C言語 - テキストファイルを読み取る

C言語 - テキストファイルを読み取る


C言語でのテキストファイル読み取りを試してみたい。

開いて閉じる

まずはファイルを開いて何もせずに閉じてみる。

ファイルは fopen 関数でオープンして、fclose 関数でクローズする。

FILE *fp = fopen("path/to/file.txt", "r");
if ( fp == (FILE *)NULL ) {
    perror("fopen error");
    return 1;
}

fclose(fp);

 

fopen 関数はファイルオープンに失敗すると NULL ポインターを返す。

fclose 関数はファイルクローズに失敗すると 0 以外を返す。

1行ずつ読み取る

次はファイルの内容を1行ずつ読み取ってみる。

fgets 関数で改行コード('\n')まで読み取りができる。

改行コード自体も読み取り結果に格納される。

fgets 関数はファイルの終端に到達するか、読み取りエラーが起きた場合に NULL ポインターを返す。

なので NULL ポインターが返されるまでループすることで、ファイルの最初から最後までを読み取れる。

char buf[512];
while ( fgets(buf, sizeof(buf), fp) != NULL ) {
    /* 読み取った内容をそのまま出力 */
    printf("%s", buf);
}

 

NULL ポインターが返された理由を調べるには feof 関数または ferror 関数を使う。

char buf[512];
while ( fgets(buf, sizeof(buf), fp) != NULL ) {
    /* 読み取った内容をそのまま出力 */
    printf("%s", buf);
}

/* ファイルの終端に達した場合 */
if ( feof(fp) ) {
    /* ~~~ 何らかの処理 ~~~ */
}

/* 読み取りエラーの場合 */
if ( ferror(fp) ) {
    /* ~~~ 何らかのエラー処理 ~~~ */
}

 

改行コードを検出する前に指定したバッファが満たされてしまった場合、fgets 関数は正常終了となる。

よって、バッファの末尾が必ず改行コードになるわけではないので注意すること。

 

次のテキストファイルを読み取る場合、バッファのサイズが 10 バイトより小さいと1回の fgets で読み取り切れない。

123456789〈LF〉

もしバッファサイズが 8 だった場合(char buf[8];)……

1回目の fgets 関数で 1234567 と ‘\0’ が、2回目の fgets 関数で 89〈LF〉と ‘\0’ がバッファに入る。


アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事