大学のサークルでC言語を後輩に教えているのですが、ファイル入出力の分野でcsvファイルの読み込みのソースを11章「エクセルを使って敵の出現データを作ってみよう」を参考に、C言語でファイル入出力を行いました。その際に疑問点が出たので質問します。
1)11章のload_story()関数内、int input[64]はどの様に使われているのか?は必要あるのか
2)11章のload_story()関数内、continue文上の『i=-1;//カウンタを最初に戻して』の部分は使われているのか?
1)に関して:int input[64]をchar inputc[64]に変更しても機能したのですが、何かしらinput[/url]を使わないと機能として不具合が生じる条件等があれば教えていただきたいです。
2)に関して:continue文の上のi=-1を抜いても普通に動きました・・・。continue文の仕様だとi=-1が無いとダメなハズなのですよね?上と同様に不具合が生じる条件等があれば教えていただきたいです。
ソースは以下の通りです。
#include<stdio.h>
#include<stdlib.h>
//構造体宣言(2次元配列を渡すため、変数charadataを構造体に)-----------
typedef struct charadata{
int charadata[32][32];
}Charadata_t;
//プロトタイプ宣言===================================================
void LoadData(Charadata_t*chara);//データのロード
void DisplayData(Charadata_t*chara);//ロードしたデータの表示
//main関数===========================================================
int main(void){
int i,j;
Charadata_t chara;
LoadData(&chara);
DisplayData(&chara);
return 0;
}
//ロードデータ関数----------------------------------------------------
void LoadData(Charadata_t *chara){
FILE *fp;
int i=0,j=0,num;
char inputc[64];
fp=fopen("data/data.csv","r");//ファイルを開く
if(fp==NULL){
printf("ファイルのオープンに失敗しました。");
exit(1);
}
while(1){
for(num=0;num<64;num++){
inputc[num]=fgetc(fp);//1文字取得する
if(inputc[num]=='/'){//スラッシュがあれば
while(fgetc(fp)!='\n');//改行までループ
continue;
}
if(inputc[num]==',' || inputc[num]=='\n'){//カンマか改行なら
inputc[num]='\0';//そこまでを文字列とし
break;
}
if(inputc[num]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
chara->charadata[j]=atoi(inputc);//読みとった文字を数字に変換
j++;
if(j==32){
j=0;
i++;
}
}
EXFILE:
fclose(fp);
}
//データ表示関数-----------------------------------------------
void DisplayData(Charadata_t*chara){
int i,j;
for(i=0;i<32;i++){
for(j=0;j<32;j++){
if(chara->charadata[j]==0){
printf("□");
}
else if(chara->charadata[j]==1){
printf("■");
}
//読み込むデータに二桁の数字を入れた場合も使用してみるため
else if(chara->charadata[j]==10){
printf("●");
}
}
printf("\n");
}
}また、読み込むファイルを添付したファイルも添付します。
コマンドライン上で32×32の絵が表示されます。