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

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

暴走モードをatoiで回避したり色々 C言語適当練習日記 第5回

   

第4回のscanfがらみの暴走については、初心者のためのポイント学習C言語:第7章 標準ライブラリ関数にならい、atoiを使って回避することにした。

この方法論だと、scanfで一旦文字列を拾ってきて、その文字列を整数に変えるという感じになる。なるほどなあ。

あとは第1回のときに、適当に作っていたテキストファイル読み込む文を、ちょっと変えたのと、そのテキストファイルがmapdata00.txtだったのを、mapdata1.txt、mapdata2.txt、mapdata3.txtの三つに分けて、ステージ番号の選択によって、それぞれ別のテキストを読むような形にした。

あとは、そのステージ番号が最大3であることを、defineで定義づけして、自作ヘッダファイルに押し込んだ。

次は、読み込んだファイルをただ表示するだけじゃなくて、データとして確保する方法を模索するターンかもしれない。


ヘッダファイルは略

[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 = 4; //選べるくじの番号の最大値 現状では4固定。いずれ、ステージ用のデータ読み込みから値を得たい。

//入力数値でステージ選択 FINALSTAGENUMBERは選択できる最大数 amida.hにて define済
decide_stage_number = SelectNumber("ステージ", FINALSTAGENUMBER);
// ステージ数を渡して、マップデータ読み込み
MapDataReading(decide_stage_number);

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

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

// 第4回で書いたprintfは、SelectNumber()の方に組み込み。あくまで、内部動作確認用なので

return 0;
}[/c]

[c language="++"]// 整数を選択するための関数
#include <stdio.h>
#include <stdlib.h> // atoiを使うことにしたのでこれを追加。

// message[]は「なんとかの番号を入力してください」という表示用の文字列、numbermaxは入力できる整数の最大値
int SelectNumber(char message[], int numbermax){

int number = 0; // bufferの数値を整数化した数値。これが決定した数字になる。while文の関係上初期値0設定
char buffer[20]; // scanfで打ち込む文字列。バッファー20まで。

// もし打ち込んだ数字が1からnumbermaxまでの数字じゃないときはループ。
while((number<1) || (number>numbermax)){

printf("1から %d までの %s の番号を入力してください。\n", numbermax, message); // 指示用のメッセージを表示
scanf("%19s",&buffer); //文字列打ち込み 制限19
number = atoi(buffer); //文字を整数化
}

printf("今選択した%sは %d です。\n",message, number); // 動作確認用の選択数値の表示。

return number; // 選択数字を帰す
}[/c]

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

int MapDataReading(int stage_number)
{
FILE *fp;
char *p; // 終了判定用らしい
char str[64]; // ファイル読み込み1回につき
char textfile_name[20]; // 読み込みたいファイルの名前を入れる文字列

// 選択したステージの数字によって、それぞれにあったマップファイルを読み込むための文字列作成
// mapdata数値.txtというファイルが対象となる。つまり各面でテキストファイルを分ける手法をとった。
sprintf(textfile_name, "mapdata%d.txt", stage_number);

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

// ここからは暫定的な文。現段階ではただ画面に表示しているだけのもの
// 今後、構造体やらfor文やらで、データとして拾う予定。

// 1行読み込みのための呪文
p = fgets(str, 64, fp);

// 1行読んだものを画面に出して、1行読み込む感じの繰り返し。
// 読みファイルが空っぽというかラストまで来たらループ地獄から脱出。
// do while でくくった方が上を1文を書かずに済むのでいいのかもしれない。
while (p != NULL)
{
printf("%s", str);
p = fgets(str, 64, fp);
}
// ファイル開けたら締める。小学校時代からのお約束。
fclose(fp);

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

return 0;
}[/c]

 - C言語練習