• 締切済み

テキストファイルについて

以前は、マップを作るときに下のようにしていたのですが 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); }

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

あっ大ボケに気づきました(^_^;) これだとコンパイルエラーですね。 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" ); } }

ForceFeed
質問者

お礼

ありがとうございます。 動作の勉強をさせてもらいます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

#3のzwiです。 >((2)の引数を両方に渡すと言うのはポインタを使うのでしょうか?) そうです配列のポインタを引数で渡します。 char dungeon[5][5]; を渡すとしたら、 呼び出し。mapload( "map.txt", dungeon ); 受ける関数側 void mapload( char *mapfile, char** dungeon) { マップのロード処理(省略) } ちなみにダンジョンサイズが可変だとさらに一工夫必要です。 mallocとか構造体とかの知識が必要ですね。

ForceFeed
質問者

補足

ご指南ありがとうございます。 うは、**(ポインタのポインタ)ですか…。 まだまだ、C言語の知識が浅くて、ゲーム完成までずいぶんと時間が掛かりそうです。^_^; ポインタもイメージはだいぶ掴めてはいるつもりですが、実際のところ 使い所がパッとイメージできなくて、地味にreturnで値返すような関数を作るばかりです。 ポインタをどういうところで活用すればいいか、早くイメージできるようになりたいなぁ~ >mallocとか構造体とかの知識が必要ですね。 構造体は現在も勉強中です。 キャラクタステータスを作るのに、役立ってます。ただ値のやり取りにあたふたしてますが^_^; mallocは、これからがんばって覚えます。まだぜんぜん手が伸びてない 単語です。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

見て思ったことは、mapは一回表示させるだけでよいのか? dungeonデータなんだったら、毎回表示しません? って事で訂正案。 (1)mapの読み込みと表示を別関数にする。 (2)mapデータの保存配列はmain側に用意して、引数で読み込み側と表示側に渡す。 (3)ファイル名が複数の場合はファイル名をstaticな2次元の文字列配列にして、読み込むファイルの番号を読み込み関数の引数として渡す。

ForceFeed
質問者

補足

ありがとうございます。 おっしゃるとおりです。 ダンジョンなので階段を上がったり下がったりさせるので、 そのつど、ダンジョン表示を切り替えたいけど、どうしたらいいのかなと考えてました。 訂正案の1は、なんとなく理解できます。 2と3は、もう少し勉強して理解できるようにがんばります。 ((2)の引数を両方に渡すと言うのはポインタを使うのでしょうか?) せっかく教えていただいているのに、あやふやな知識で申し訳ありません。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.2

>複数作った上のようなマップを切り替える時、どうすればいいんでしょうか?  複数が「ファイル」であるなば、以下のように関数 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 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

ForceFeed
質問者

補足

ありがとうございます。 ファイルを配列変数の用に扱うというのは、 知りませんでした>< もっと、勉強します

回答No.1

>複数作った上のようなマップを切り替える時、どうすればいいんでしょうか? 別ファイルなら、fopen()で開くファイル名を変える。 一つのファイルに複数なら、 1.識別子を用意してその識別子後をデータとする。 2.固定長なら、必要なデータまでseek()で読み飛ばして、必要な部分だけ取得する。 とか。

ForceFeed
質問者

補足

ありがとうございます。 ダンジョンは、一個一個別々のファイルにして作ってました。 一個のファイルに、いくつもダンジョン書いておいて、 処理するというのは、頭に浮かんできませんでした。 seek()って言う関数なら、処理できるんですか。 これから勉強します。

関連するQ&A