- 締切済み
テキストファイルについて
以前は、マップを作るときに下のようにしていたのですが char dungeon[5][5]={{0,0,0,1,1}, {1,1,0,1,1}, {1,0,0,0,1}, {1,1,0,1,1}, {1,1,0,0,0}}; for(i=0;i<5;i++){ for(j=0;j<5;j++){ else if(dungeon[i][j]==0)printf("+"); else printf("#"); } printf("\n"); } 最近、ファイルの入出力で読み込む事にチャレンジしています。 それで、メモ帳で書いたマップを使おうとしているのですが、 こんなのです。 1011111111111 1000000000001 1111111111101 1111100000001 1111100000001 1111100000001 1111100002001 1000000000001 1011111111111 fp = fopen("map.txt","r");の部分でテキストファイルを指定しますが、複数作った上のようなマップを切り替える時、どうすればいいんでしょうか? 質問が稚拙かもしれませんがよろしくお願いします。 #include <stdio.h> void map(void);//マップの表示関数の宣言 int main(){ map(); } void map(void));//マップの表示関数の定義 { FILE *fp; char str[1024];//これくらいでいいかな? //map.txtを読み込みモードで開く fp = fopen("map.txt","r"); //ファイルオープンに失敗したら if(fp==NULL){ //失敗を表示し終了 printf("ファイルのオープン失敗\n"); return -1; //exit;でもいいのかな? } //fgetsの戻り値がnullになるまで //strにファイルから内容を格納 while((fgets(str,256,fp))!=NULL){ //格納された文字を出力 printf("%s",str); } //ファイルを閉じる fclose(fp); }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- zwi
- ベストアンサー率56% (730/1282)
あっ大ボケに気づきました(^_^;) これだとコンパイルエラーですね。 char** dungeonは見なかったことに・・・。 何年C言語書いているんだ俺OTL 動作確認を兼ねて、配列受け渡しのサンプルです。 ※ これが正解ですので、申し訳ない。 void mapload( char *mapfile, char (*dungeon)[5]); int main(void) { char dungeon[5][5]; int i,j; for( i=0; i<5 ; i++ ) { for( j=0; j<5 ; j++ ) { dungeon[i][j] = i*10+j; } } mapload( "map.txt", dungeon ); } void mapload( char *mapfile, char (*dungeon)[5]) { int i,j; for( i=0; i<5 ; i++ ) { for( j=0; j<5 ; j++ ) { printf( "%02d ", dungeon[i][j] ); } printf( "\n" ); } }
- zwi
- ベストアンサー率56% (730/1282)
#3のzwiです。 >((2)の引数を両方に渡すと言うのはポインタを使うのでしょうか?) そうです配列のポインタを引数で渡します。 char dungeon[5][5]; を渡すとしたら、 呼び出し。mapload( "map.txt", dungeon ); 受ける関数側 void mapload( char *mapfile, char** dungeon) { マップのロード処理(省略) } ちなみにダンジョンサイズが可変だとさらに一工夫必要です。 mallocとか構造体とかの知識が必要ですね。
補足
ご指南ありがとうございます。 うは、**(ポインタのポインタ)ですか…。 まだまだ、C言語の知識が浅くて、ゲーム完成までずいぶんと時間が掛かりそうです。^_^; ポインタもイメージはだいぶ掴めてはいるつもりですが、実際のところ 使い所がパッとイメージできなくて、地味にreturnで値返すような関数を作るばかりです。 ポインタをどういうところで活用すればいいか、早くイメージできるようになりたいなぁ~ >mallocとか構造体とかの知識が必要ですね。 構造体は現在も勉強中です。 キャラクタステータスを作るのに、役立ってます。ただ値のやり取りにあたふたしてますが^_^; mallocは、これからがんばって覚えます。まだぜんぜん手が伸びてない 単語です。
- zwi
- ベストアンサー率56% (730/1282)
見て思ったことは、mapは一回表示させるだけでよいのか? dungeonデータなんだったら、毎回表示しません? って事で訂正案。 (1)mapの読み込みと表示を別関数にする。 (2)mapデータの保存配列はmain側に用意して、引数で読み込み側と表示側に渡す。 (3)ファイル名が複数の場合はファイル名をstaticな2次元の文字列配列にして、読み込むファイルの番号を読み込み関数の引数として渡す。
補足
ありがとうございます。 おっしゃるとおりです。 ダンジョンなので階段を上がったり下がったりさせるので、 そのつど、ダンジョン表示を切り替えたいけど、どうしたらいいのかなと考えてました。 訂正案の1は、なんとなく理解できます。 2と3は、もう少し勉強して理解できるようにがんばります。 ((2)の引数を両方に渡すと言うのはポインタを使うのでしょうか?) せっかく教えていただいているのに、あやふやな知識で申し訳ありません。
- yama5140
- ベストアンサー率54% (136/250)
>複数作った上のようなマップを切り替える時、どうすればいいんでしょうか? 複数が「ファイル」であるなば、以下のように関数 map() を、ファイル名を引数として呼び出せばよいのでは・・。 #include <stdio.h> #include <stdlib.h> void map( char cName[] ) { int nn; FILE *fp; char str[ 1024 ]; fp = fopen( cName, "r" ); if( NULL == fp ){ fprintf( stderr, "ファイルのオープン失敗\n" ); exit( 0 ); } while( NULL != fgets( str, 1024, fp ) ){ nn = 0; while( '0' <= str[ nn ] ){ // 復帰改行まで if( '0' == str[ nn ] ) printf( "+" ); if( '1' == str[ nn ] ) printf( "#" ); nn++; } printf( "\n" ); } fclose( fp ); } int main() { map( "map1.txt" ); map( "map2.txt" ); map( "map3.txt" ); return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
補足
ありがとうございます。 ファイルを配列変数の用に扱うというのは、 知りませんでした>< もっと、勉強します
- SilverThaw
- ベストアンサー率32% (260/806)
>複数作った上のようなマップを切り替える時、どうすればいいんでしょうか? 別ファイルなら、fopen()で開くファイル名を変える。 一つのファイルに複数なら、 1.識別子を用意してその識別子後をデータとする。 2.固定長なら、必要なデータまでseek()で読み飛ばして、必要な部分だけ取得する。 とか。
補足
ありがとうございます。 ダンジョンは、一個一個別々のファイルにして作ってました。 一個のファイルに、いくつもダンジョン書いておいて、 処理するというのは、頭に浮かんできませんでした。 seek()って言う関数なら、処理できるんですか。 これから勉強します。
お礼
ありがとうございます。 動作の勉強をさせてもらいます。