Help us understand the problem. What is going on with this article?

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

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

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バイト分だぜ」

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away