ファイルオープン方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あ~る

ファイルオープン方法について

#1

投稿記事 by あ~る » 15年前

今回、東方や龍神録のように、タイトルからリプレイボタンを選ぶとリプレイファイルの難易度情報(EasyやHardなど)一覧を表示する、といった処理を実装しようと思いました
以下がそのソースなんですが
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ライブラリを使っています
画像

ookami

Re:ファイルオープン方法について

#2

投稿記事 by ookami » 15年前

気づいた点を指摘させていただきます。
・前者だと、ファイルが存在する場合、fopenを2回連続で行っていますね。5行目と14行目です。
・ファイルが無い場合はfcloseする必要はありません。前者でも後者でもそうなっていますね。

参考になれば幸いです。

あ~る

Re:ファイルオープン方法について

#3

投稿記事 by あ~る » 15年前

ookamiさん返信ありがとうございます

>>前者だと、ファイルが存在する場合、fopenを2回連続で行っていますね。5行目と14行目です。
これはこの掲示板にソースをコピペする際にミスってしまいました。編集で直しておきます。

>>ファイルが無い場合はfclose する必要はありません。前者でも後者でもそうなっていますね。
そうだったんですか、知りませんでした。
教えて頂きありがとうございます^^

他に問題点ございましたら指摘などお願いします。

ookami

Re:ファイルオープン方法について

#4

投稿記事 by ookami » 15年前

なんと。コピーミスでしたか。すると...ちょっと私も「やってる事は変わらないように思える」ですね...^^:

あとはステップ実行してみるくらいしかないと思います。

あ~る

Re:ファイルオープン方法について

#5

投稿記事 by あ~る » 15年前

返信遅なってすいません・・・
この掲示板携帯でフィルタリングにかかるようになっちゃいました・・・(泣)

やっぱり変わらないですよね。
何なんでしょうか・・・
ステップ実行が何なのかわかりませんが、調べてやってみようと思います。
ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る