LoginSignup
0

More than 5 years have passed since last update.

[C]ファイルの内容を取得して変数に文字列として格納する

Last updated at Posted at 2018-11-23

勝手な解釈が詰まってますので解説的な部分はアテにしないでください。

C言語でファイルの内容を取得して変数に格納するのが意外と手こずったので備忘録として置いときます(筆者がクソザコナメクジだからとか言わないで)。Cをワチャワチャすると自分の実力不足が露呈しますね…

コード

#include<stdio.h>
#include<stdlib.h>

int main(void){
    FILE *file_contents;
    char *strp;

    if((file_contents = fopen("hoge.txt", "r")) == NULL) {
        fprintf(stderr, "file open failed\n");
        exit(1);
    }

    fseek(file_contents, 0, SEEK_END);
    size_t file_size = ftell(file_contents);
    fseek(file_contents, 0, SEEK_SET);

    if((strp = malloc(file_size)) == NULL) {
        fprintf(stderr,"malloc error\n");
        exit(1);
    }

    for(int i = 0; i < file_size; i++) {
        strp[i] = fgetc(file_contents);
    }
    printf("%s", strp);

    free(strp);

    return 0;
}

解説的な

fseek()で第三引数にSEEK_ENDを指定するとファイル位置表示子(カーソル的なもの)をファイルの内容の一番最後に置いてくれます。そしてftell()はそのファイル位置表示子の値、つまりカーソル的なものの位置を読んでくれます。ファイル内容の一番最後の位置の値は、そうです、ファイルのサイズと同じですね。

fseekで第三引数にSEEK_SETを指定すると、カーソルを一番最初に置いてくれます。

で、malloc()でファイルサイズ分メモリを確保し「箱」を用意します。ファイルサイズ分forで回してfgetc()でファイルから1文字ずつ取得し、その文字をどんどん配列strpに入れていきます。(ファイルから1文字ずつ取得するのに、カーソルをその場から一つずつ移動させながら読むため、カーソルが一番最後だと虚無を読むことになってしまいます。わざわざ一番最初に置くようにしたのはそのためです。)

あとは出来たstrpを文字列として表示させるなり焼くなり煮るなり何でもしてください、最後にfree()でメモリを開放し工事完了です…

「最初にchar strp[1024];とかでメモリを確保すればいいじゃん」

余った分のメモリがもったいないしファイルサイズが最初に確保した分より多かったらまずい。
「そこのお前!メモリ1バイト分が食うメモリはメモリ1バイト分だぜ」

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0