トップページ > 過去ログ > 記事閲覧
ファイルの読み込み
名前:DX 日時: 2007/03/02 16:35

ファイルを読み込みたいんですが 10 10 1111111111 2000000000 2000000002 のようになってるんですが 最初の値はマップの縦と横の数です 次がマップの種類なんですが これを読み込むときマップの高さと 横の数はうまく読み込めますが 次のマップの種類のデータがうまく 読み込めません 下のがソースです //ファイルを開く maphandle = FileRead_open("map.txt"); char buffermapwidth[32]; char buffermapheight[32]; //マップサイズの読み込み FileRead_gets(buffermapwidth,32,maphandle); FileRead_gets(buffermapheight,32,maphandle); //全体のマップの横数 worldmapwidth = atoi(buffermapwidth); //全体のマップの縦数 worldmapheight = atoi(buffermapheight); //マップの大きさ int mapdatasize = worldmapwidth * worldmapheight; //バッファの大きさを確保する buffermapdata = (char *)malloc(sizeof(char) * worldmapwidth + 2); //マップデータの大きさを確保する mapdata = (int *)malloc(sizeof(int) * mapdatasize); //マップの読み込み for (int y = 0; y < worldmapheight; y++) { FileRead_gets(buffermapdata,worldmapwidth,maphandle); for (int x = 0; x < worldmapwidth; x++) { //マップデータを一文字ずつ読み取って数値型にかえる mapdata[y * worldmapwidth + x] = atoi(&buffermapdata[x]); } } //ファイルを閉じる FileRead_close(maphandle);

Page: 1 |

Re: ファイルの読み込み ( No.1 )
名前:Will 日時:2007/03/03 11:00

//マップデータを一文字ずつ読み取って数値型にかえる mapdata[y * worldmapwidth + x] = atoi(&buffermapdata[x]); この部分が間違いです。 atoiは文字列を数値に変換する関数なので、上記のコーディングでは"1111111111"と読み込んだ文字列の先頭文字だけを数値に変換することはできません。 マップの種類データの値として、0〜9までしか使用しないのであれば mapdata[y * worldmapwidth + x] = buffermapdata[x] - '0'; で、DXさんの望む処理ができると思います。
Re: ファイルの読み込み ( No.2 )
名前:DX 日時:2007/03/03 12:32

ありがとうございますできました でも FileRead_gets(buffermapdata,worldmapwidth,maphandle); の部分なんですが これは1行ずつ読み取る関数だと思いますけど FileRead_gets(buffermapdata,worldmapwidth+3,maphandle); のようにworldmapwidthは横の数ですけど これに3を足すと正しいマップで表示されます どうして横のマップの数より数字を大きくしないと マップがうまく表示されないのかがわかないんですけどわかるかたお願いします!!
Re: ファイルの読み込み ( No.3 )
名前:Will 日時:2007/03/05 09:24

●管理人さんへ FileRead_gets関数の仕様について2点質問があります。 質問1 バッファサイズを10と指定した場合、FileRead_getsがファイルから何文字リードしますか? (リファレンスの「〜Num で指定されたサイズを越える位置まで〜」、 から11文字リードするように思うのですが、その場合11文字目はどこにセットされるのだろう?) 質問2 1行の文字数がバッファサイズよりも多い場合、残った文字列は読み捨てして、ファイルポインタは次の行に移動しているのですか? それとも、リード後の位置で止まっているのでしょうか? ●DXさんへ マップリード後のmapdataの中のデータを貼り付けてもらえませんか? それを見れば、もう少し詳しく原因が調査できると思います。
Re: ファイルの読み込み ( No.4 )
名前:wiz 日時:2007/03/05 14:39

>FileRead_gets(buffermapdata,worldmapwidth,maphandle); この関数は、バッファ領域を十分とってから使用することを 前提としているので、上記のような渡すバッファと そのサイズが違っている場合などに問題があるのでは無いでしょうか? 今回の場合だと渡すバッファよりサイズのほうが小さく指定されますが、 +3するとバッファよりサイズのほうが大きくなります。 少し内容が違う過去ログですが、 管理人さんの返信があります。 ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=50
Re: ファイルの読み込み ( No.5 )
名前:管理人 日時:2007/03/06 15:06

> DXさん  FileRead_gets 関数の第二引数に渡す値に関しては wizさんが示された スレッドの通りです。分かりにくかったのでリファレンスの説明を修正+追加 しておきました。 > Willさん  質問1  9バイト分リードします。(9バイト中に全角文字が含まれている可能性も ありますのであくまで9「バイト」です)  質問2  リード後の位置で止まっています。  FileRead_gets 関数の動作の詳細をリファレンスの説明に書き加えましたので、 宜しければご覧になってみてください。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R19N8
Re: ファイルの読み込み ( No.6 )
名前:Will 日時:2007/03/07 08:51

●管理人さんへ 質問へのご回答、及びリファレンスの修正ありがとうございます。 FileRead_gets 関数の仕様が正しく理解できました。 ●DXさんへ 修正後のリファレンスに今回の問題の原因が書かれていますので、そちらを参照してください。

Page: 1 |