ファイルから構造体への代入
はじめまして、やまもと@ふくしま です。よろしくお願いします。
構造体を使った簡単なゲームを作ったのですが、ポインターを使ったところ
動作がおかしくなってしまいました。
本を読んだのですが、原因がつかめず、苦労しております。
どなたか、お知恵を貸していただけると大変助かります。
プログラム説明 CSV形式で読み込んだテキストデータを
順番に構造体に代入していくプログラムです。
A)とりあえず動くバージョン
sinario型構造体のtext1は配列として、strcatでコピーしている。→正常に動作し
ます。
struct sinario {/* シナリオ構造体の定義 */
int next;
int flag1; /* yes */
int flag2; /* no */
char text1[200];
};
struct sinario data[MAX_DATA]; /*シナリオデータ本体:グローバル定義*/
struct sinario presen_data;/*シナリオデータ表示用構造体 */
void file_read(void){
FILE *fp;
char data1[10],data2[10],data3[10],data4[200];
char buff[255];
int i;
i = 0; /* 行数カウンター初期化 */
if((fp = fopen(FILE_NAME,"r")) == NULL){
printf("シナリオファイルが存在しません");
exit(1);/* ファイルが無ければプログラム終了 */
}
while(1){
if(fgets(buff,sizeof(buff)-1,fp) == NULL) break;
/* ファイルから読み込むデータが無ければ無限ループを抜ける */
/* 読み込むデータがあれば1行まるごとbuffに格納 */
sscanf(buff,"%[^,\t],%[^,\t],%[^,\t],%[^,\t]",data1,data2,data3,data4);
/* カンマごとに文字列を区切ってdata1〜data4に代入 */
data[i].next = atoi(data1); /* 文字列を整数に変換 */
data[i].flag1 = atoi(data2); /* 文字列を整数に変換 */
data[i].flag2 = atoi(data3); /* 文字列を整数に変換 */
strcat(data[i].text1,data4);/* 構造体のメンバにデータを代入 */
i = i + 1; /* 行番号をインクリメント */
}
fclose(fp); /* オープンしたファイルを閉じる:必修 */
}
B)動作がおかしいバージョン
text1をポインターに変更。
メモリの確保はmallocを使用している。
呼び出し側で表示させると、全てのtext1に同じデータが入ってしまった。
struct sinario {/* シナリオ構造体の定義 */
int next;
int flag1; /* yes */
int flag2; /* no */
char *text1;
};
struct sinario data[MAX_DATA]; /*シナリオデータ本体:グローバル定義*/
struct sinario presen_data;/*シナリオデータ表示用構造体 */
void file_read(void){
FILE *fp;
char data1[10],data2[10],data3[10],data4[200];
char buff[255];
int i; /* 行数カウンタ */
int len; /* シナリオの長さ */
i = 0; /* 行数カウンター初期化 */
if((fp = fopen(FILE_NAME,"r")) == NULL){
printf("シナリオファイルが存在しません");
exit(1);/* ファイルが無ければプログラム終了 */
}
while(1){
if(fgets(buff,sizeof(buff)-1,fp) == NULL) break;
/* ファイルから読み込むデータが無ければ無限ループを抜ける */
/* 読み込むデータがあれば1行まるごとbuffに格納 */
sscanf(buff,"%[^,\t],%[^,\t],%[^,\t],%[^,\t]",data1,data2,data3,data4);
/* カンマごとに文字列を区切ってdata1〜data4に代入 */
data[i].next = atoi(data1); /* 文字列を整数に変換 */
data[i].flag1 = atoi(data2); /* 文字列を整数に変換 */
data[i].flag2 = atoi(data3); /* 文字列を整数に変換 */
len = strlen(data4); /* 文字長さ取得 */
data[i].text1 = malloc(sizeof(char)*len); /* メモリーを必要な分確保 */
data[i].text1 = data4;
i = i + 1; /* 行番号をインクリメント */
}
fclose(fp); /* オープンしたファイルを閉じる:必修 */
}
以上よろしくお願いします。
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735