普段はC++を使用しているのですが、今回はC言語限定ということで、
C言語でプログラムを作成しています。
プログラムの概要を記載いたします。
ファイルを読み込んでその内容をバッファに格納したいです。
C++であればstringで処理をするのですが、今回はmallocを使って動的にメモリ確保を行いたいです。
ただし、メモリサイズを事前に決めるのではなく、reallocを使用して処理を行いたいです。
以下にソースコードを記載いたします。
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
int main(void)
{
FILE *fp; /* ファイルポインタの宣言 */
char *buff = (char*)malloc(10 * sizeof(char));;
if (! buff) {
err(EXIT_FAILURE, "can not malloc");
}
//char c;
if ((fp = fopen("memory_dynamic_control.c", "r")) == NULL) { /* ファイルのオープン */
printf("file open error!!\n");
return 1;
}
char s[256];
int index=0;
int i=0;
int max=0;
while (fgets(s, 10, fp) != NULL) {
//printf("%s", s);
//index=0;
i=0;
max=index+10;
for(index; index<max; index++){
*(buff+index)=s[i++]; //読み込んだ文字列をバッファにコピー
//printf("%d",i);
}
//バッファサイズを更新
char *tmp;
tmp = realloc(buff, 10 * sizeof(char));
if (! tmp) {
free(buff); // 失敗したら自分で解放する
err(EXIT_FAILURE, "can not realloc");
}
buff = tmp;
index+=10;
}
printf("%s", buff);
free(buff); // プログラムが終了するので、解放しないでもOSがしてくれる。
return 0;
}
処理の概要を説明いたします。
まず、このソースコード名が「memory_dynamic_control.c」となっており、
このプログラムは自分自身の内容を表示する物となっています。
最初にファイルを開いて、fgets関数で10バイトずつ読み込んでいます。
そして、10バイトずつバッファに格納していきます。
バッファに格納する際に、realloc関数を使って、バッファサイズを10バイトずつ増やしています。
最後の「printf("%s", buff);」の部分で、ソースコーソの内容をすべて表示したいのですが、
実行結果はプログラムの一行目しか表示されません。
自分でも確認いたしましたが、一行目しか表示されないことの原因がわかりません。
アドバイスや、別解などをご教授いただければ幸いです。
よろしくお願いいたします。
※最初はセグメンテーションフォルトが出るという旨を投稿いたしましたが、
上記のプログラムでは実行はできていました。
ただ、望んだ結果ではなく、プログラムの一行目しか表示されていないという結果でした。