FileRead_openが途中で利かなくなる

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

FileRead_openが途中で利かなくなる

#1

投稿記事 by Yuno » 15年前

こんにちはYunoです
DXアーカイブを読み込むため、
下記の関数をファイル読み込みで毎回呼んでいるのですが
途中でFileRead系の関数が利かなくなって0ばっかり返してきます

void DxAPath(char *APath){
static int flag=0;
static int fhandle,fsize;
static int *buf;
SetUseDXArchiveFlag( TRUE ) ;
SetDXArchiveExtension( "dat" ) ;
SetDXArchiveKeyString( "****" ) ;//passは保護のため****に置き換えています
fhandle=FileRead_open(APath);<-問題の場所
fsize=FileRead_size(APath);
if(fhandle==0){
CString stra;
stra.Format(_T("Read error!\nNow Process = SetDecryptG\n%s"),APath);
::MessageBox(NULL,stra,_T("ERROR"),MB_OK);
DxLib_End();
}
buf=(int *)malloc(fsize*sizeof(int));
FileRead_read(buf,fsize,fhandle);
FileRead_close(fhandle);//<--close
SetUseDXArchiveFlag(FALSE);
SetDXArchiveKeyString() ;
file_load.buf=buf;
file_load.fsize=fsize;
flag=1;
}

いったいどうすれば正常に読み込めるでしょうか?
このコードはなんか変なんでしょうか?
教えてください 画像

Justy

Re:FileRead_openが途中で利かなくなる

#2

投稿記事 by Justy » 15年前

 デバッグ向けに出力される Log.txtは確認してみましたか?

Yuno

Re:FileRead_openが途中で利かなくなる

#3

投稿記事 by Yuno » 15年前

Log.txtには特にそれらしきものは見つかりませんでした
いつも通りです

ちなみにこの関数はちょいとした暗号化を解くための読み込み関数で
暗号化の解除自体は下記の関数で行います
だから実際DXアーカイブから暗号化されたファイルを読もうとするとLoadGraphの代わりに
DxAPath("...");
DecryptionReadingG("...");
といった感じで毎回呼び出しています
ほかにもGV,WAV,Oggに対する同様の処理があります

とにかくその関数です
void DxAPath(const char *path){
static int flag=0;
static int fhandle,fsize;
SetUseDXArchiveFlag( TRUE ) ;
SetDXArchiveExtension( "dat" ) ;
SetDXArchiveKeyString( "****" ) ;
fsize=FileRead_size(path);
file_load.buf=(int *)malloc(fsize*sizeof(int));
fhandle=FileRead_open(path);
if(fhandle==0){
CString stra;
stra.Format(_T("Read error!\nNow Process = SetDecryptG\n%s"),path);
::MessageBox(NULL,stra,_T("ERROR"),MB_OK);
DxLib_End();
}
FileRead_read(file_load.buf,fsize,fhandle);
FileRead_close(fhandle);//<--close
SetUseDXArchiveFlag(FALSE);
SetDXArchiveKeyString() ;
file_load.fsize=fsize;
flag=1;
}

int DecryptionReadingG(char *path){
static int num;
FILE *fp ;
int set[/url]={137,80,78,71};
int ret;
if(IsFolderExist(_T("C:\\Program Files\\thM01\\temps"))==false){
bool ok;
ok=CreateFolderBySHCreateDirectoryEx(_T("C:\\Program Files\\thM01\\temps"));
if(ok==false){
CAtlString str;
str.Format(_T("初期化に失敗しました\nof %dst place"),num);
::MessageBox(NULL,str,_T("初期化エラー"),MB_OK);
}
}
string fn;
fn=SplitFullPath(path);
string s;
char c[DECRY_MAX];
s="C:\\Program Files\\thM01\\temps\\"+fn+"\0";
strcpy(c,s.c_str());
fp = fopen(c,"wb");//##open
//復号化開始
int open_s=Decode(file_load.buf,NULL);
char *dec;
dec=(char *)malloc((open_s+1)*sizeof(char));
Decode(file_load.buf,dec);
free(file_load.buf);
//free(buf);
int r=fwrite( dec , sizeof( char ) ,open_s, fp ) ;
free(dec);
char gph[DECRY_MAX];
strcpy(gph,s.c_str());
fclose( fp ) ;
fp = fopen( gph,"rb+");
fwrite( " PNG" , sizeof( char ) , 4 , fp );
const int a=137;
rewind(fp);
fclose(fp);
fp = fopen( gph,"rb+");
fwrite( &a , sizeof( char ) , 1 , fp );
fclose( fp ) ;//<-close
line:
ret=LoadGraph(gph);
printfDx("%d\n",ret);
remove(gph);
num++;
if(ret==-1)
{
static int k;
if(k<50)
goto line;
}
return ret;
}

画像

Yuno

Re:FileRead_openが途中で利かなくなる

#4

投稿記事 by Yuno » 15年前

呼び出している構造はこんな感じです
main.cpp
├Load.cpp
│ここで大抵の呼び出しが終わる
├ini.cpp
│ここで3D背景の初期化やらなんやら現在ここの3D背景読み込みでその状態になる
:
:
├title.cpp&music.cpp
:音楽の読み込み...まだここにたどり着けない
:

Justy

Re:FileRead_openが途中で利かなくなる

#5

投稿記事 by Justy » 15年前

 ログにないとなると、ちょっと厄介ですね。
 
 記載されているコード的には
・ FileRead_size()の結果が 0だった場合、malloc(0)となり処理系定義の動作となる
・ FileRead_open()の結果が 0だった場合、メモリがリークする
・ エラー発生時の処理が不適切
といった問題やら意図不明な処理が幾つかありますが、PCでしょうし、ん百MBとかの規模で
派手にリークしない限り今回の原因とは関係なさそうです。


 となるとここに記載されている以外の部分に問題があるのかもしれません。
 考えられる理由としては

・ 同時に開ける最大ファイル数を越えた(たしか 512ファイル)
・ ファイル情報を格納するメモリの確保に失敗した
・ そもそもファイルが読み取れない(存在しない、権限がない等)

くらいなのですが、再現可能なサンプルでもないとこちらではわかりません。


 そこで提案ですが、再現可能なサンプルを添付していただくか、或いは
DXライブラリはオープンソースなので、libを直接リンクするのではなく、
ライブラリソースからコンパイルしてこのプロジェクトとリンクするよう設定し、
FileRead_open()のどこで、0を戻しているのかステップ実行して調べてみてはどうでしょうか?

閉鎖

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