ま総研2000(まどの総合研究所ver.5.1)

みんながみんなその物事に興味があると思っちゃいけないよという精神で綴る備忘録

ファイル読み込み文模索中 C言語適当練習日記 第6回

   

色々と触っていくうえで、マップデータを配列に入れ込みたいなあと思ったところ、どうやら、関数の引数に配列そのものを渡すことができないらしい。(参考:C言語改訂版1 はじめてのプログラミング、P183)

なんか面倒くさい話だねえってことで、ポインタを渡さないといけないのかなあといった状況へ。

気が向けば続く。

[c language="++"]#include <stdio.h>
#include "amida.h"// amida.hはあみだくじ作成用の自作ヘッダファイル

int main(void)
{
int decide_stage_number; // 選択決定したステージ番号
int decide_kuji_number; // 選択決定したくじの番号
int final_kuji_number; // 選択できるくじの最大数、マップデータ読み込みにより取得

//入力数値でステージ選択 FINALSTAGENUMBERは選択できる最大数 amida.hにて define済
decide_stage_number = SelectNumber("ステージ", FINALSTAGENUMBER);
// ステージ数を渡して、マップデータ読み込み
// この関数からもってくるのは、選択できるくじの最大数とマップデータという名の文字列
final_kuji_number = MapDataReading(decide_stage_number);

//入力数値でくじ選択、関数そのものは、ステージ選択のものと同じ。
decide_kuji_number = SelectNumber("くじ", final_kuji_number);

// これによってそのステージにおけるスタート位置を決定して、あとはあみだを進みたいわけだ。

return 0;
}[/c]

[c language="++"]// マップデータのファイルを読み込む文、引数はステージ番号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "amida.h"

int MapDataReading(int stage_number)
{
// 前回までの終了判定用の*pは、feof()でまかなうことに変更。
FILE *fp;
char str[64]; // ファイル読み込み1回分あたりの読み込み量
char textfile_name[20]; // 読み込みたいファイルの名前を入れる文字列
int final_kuji_number; // くじ番号の最大数

int str_length; // 1行読み込んだものの文字数

char mapdata[MAPCHIPMAX][MAPCHIPMAX]; // とりあえずのマップデータ用の各座標ごとの文字入れ、ただし[y][x]

// 選択したステージの数字によって、mapdata数値.txtを読み込むための文字列作成
sprintf(textfile_name, "mapdata%d.txt", stage_number);

// textfile_nameのファイルが開いたかどうかの判定。読み込み用。
if((fp = fopen(textfile_name,"r")) == NULL){
printf("ファイルロードエラー\n");
exit(1);
}

// ファイル1行目でくじの最大数の読み込み ここのエラー処理をどうするかは後で考える。
// とりあえずEOFのときだけパスにはした。
fgets(str, 64, fp);
if(!feof(fp)) {
final_kuji_number = atoi(str);
}

// ファイル2行目からは、for文でマップデータを読み込み
// 条件は便宜上MAPCHIPMAXまで
for (int y=0; y < MAPCHIPMAX ; y++){

if(fgets(str, MAPCHIPMAX, fp) == NULL) break; // データ1行読み込み、ヌルならfor文脱出
str_length = strlen(str); // 一行の文字数
printf("Y=%2dの文字数%d ", y+1,str_length); // 動作確認用 後で消す。

// 取り込んだ1行を1文字ずつに分解して、マップデータ(y,x)に格納
// 配列→ポインタ or 構造体の順にここを発展させる予定。
for (int x=0; x < str_length; x++){

// マップデータ(y,x)に対して、読み込んだ1行のstrのx番目の文字を代入。
mapdata[y][x] = str[x];
printf("%c", mapdata[y][x]); //動作確認用の表示 後で消す。
}
}

// 読み込みファイルを閉じる
fclose(fp);

puts(""); // とりあえずの改行

// ただ現段階で、この関数はint型の数値を返すものなので、char*は返せないのだ。
// 打開策としては、頭の部分でポインタを受け取る方法かなあ。
return final_kuji_number;
}[/c]

 - C言語練習