暴走モードを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]
Pick Up
- 1
-
Macbook air Mid2012 のバッテリー交換を行おうとして右往左往したときのログ(前編)
やったときのログシリーズ、バッテリー交換編
- 2
-
Macbook Air Mid2012 のバッテリー交換をしたときのメモ(後編)
バッテリー交換後編。