勝手な解釈が詰まってますので解説的な部分はアテにしないでください。
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バイト分だぜ」