ファイルオープン方法について
Posted: 2010年6月04日(金) 23:59
今回、東方や龍神録のように、タイトルからリプレイボタンを選ぶとリプレイファイルの難易度情報(EasyやHardなど)一覧を表示する、といった処理を実装しようと思いました
以下がそのソースなんですが
というようにファイルを開くと、ファイルが無い場合の処理は上手くいくのですが、ファイルがある場合、番号が存在するファイルの中で一番大きいファイル(replay1.dat,replay3.dat,replay15.datがある場合はreplay15.dat、一番最後に開かれたファイル?)の情報が存在しているファイルの番号のreplay_game_mode全てに入れられてしまいます。
すごくわかりにくくてすいません・・・
それで、ソースコードを以下のように書き換えました
このようにしたところ、しっかり番号通りのreplay_game_modeに、対応した番号のリプレイファイルの難易度情報が入れられました。
ただ最初と変えた後とでやってる事は変わらないように思えるのですが、どこにどう違いがあるのでしょうか?
正しい処理は出来るようになったのですが原因がわからないので不安です
状況が分かりづらくてすいません
どなたかご教授よろしくお願いします。
環境はWindousXP
BorlandC++でBCCDeveropperを使っています
DXライブラリを使っています

以下がそのソースなんですが
char replay_name[64]; for(i=0;i<20;i++){ memset(replay_name,0,sizeof(char)); sprintf(replay_name,"media/replay/replay%d.dat",i+1); FILE *fp; if((fp=fopen(replay_name,"rb"))==NULL){//ファイルが無かったら //printfDx("ファイルオープンエラー\n"); replay_game_mode=-1;//難易度情報に-1を入れる //break; fclose(fp); } if((fp=fopen(replay_name,"rb"))!=NULL){//あったら fread( replay_info, sizeof(unsigned char),10,fp); fread( &replay, sizeof(replay_t), 1, fp ) ; fread( replay_save_key, sizeof(unsigned char), REPLAY_MAX_TIME, fp ); fclose( fp ); replay_game_mode=replay_info[4];//難易度情報にリプレイの難易度情報を入れる } }
というようにファイルを開くと、ファイルが無い場合の処理は上手くいくのですが、ファイルがある場合、番号が存在するファイルの中で一番大きいファイル(replay1.dat,replay3.dat,replay15.datがある場合はreplay15.dat、一番最後に開かれたファイル?)の情報が存在しているファイルの番号のreplay_game_mode全てに入れられてしまいます。
すごくわかりにくくてすいません・・・
それで、ソースコードを以下のように書き換えました
for(i=0;i<20;i++){ memset(replay_name,0,sizeof(char)); sprintf(replay_name,"media/replay/replay%d.dat",i+1); FILE *fp = fopen( replay_name, "rb" ); if(!fp){ replay_game_mode=-1; fclose(fp); }else{ fread( replay_info, sizeof(unsigned char),10,fp); fread( &replay, sizeof(replay_t), 1, fp ) ; fread( replay_save_key, sizeof(unsigned char), REPLAY_MAX_TIME, fp ); fclose( fp ); replay_game_mode=replay_info[4]; } }
このようにしたところ、しっかり番号通りのreplay_game_modeに、対応した番号のリプレイファイルの難易度情報が入れられました。
ただ最初と変えた後とでやってる事は変わらないように思えるのですが、どこにどう違いがあるのでしょうか?
正しい処理は出来るようになったのですが原因がわからないので不安です
状況が分かりづらくてすいません
どなたかご教授よろしくお願いします。
環境はWindousXP
BorlandC++でBCCDeveropperを使っています
DXライブラリを使っています
