ファイル読み込み文模索中 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]
Pick Up
- 1
-
Macbook air Mid2012 のバッテリー交換を行おうとして右往左往したときのログ(前編)
やったときのログシリーズ、バッテリー交換編
- 2
-
Macbook Air Mid2012 のバッテリー交換をしたときのメモ(後編)
バッテリー交換後編。