mogwai93
11-07-2005 07:27:57
j'essaie de faire un programme qui extrait les fichiers contenus dans un autre.
pour le moment, je commence avec les fichiers .pak de dune 2
certains contiennent des fichiers sons et ce sont eux qui m'interessent
voici la structure :
<position du debut du fichier 1> (4 octets)
<nom du fichier 1> (x octets)
<caractere nul>
<position du debut du fichier 2> (4 octets)
<nom du fichier 2> (x octets)
<caractere nul>
...
<position du debut du dernier fichier> (4 octets)
<nom du dernier fichier> (x octets)
<caractere nul>
<4 octets à 0>
puis
viennent les donnees
plusieurs problemes :
1) rien que le fait de lancer le programme me prend deja 3 Mo !!
pourtant rien en memoire dans le code
je ne fais qu'appeler une fenetre créée dans les ressources
2) ca ne semble pas fonctionner 2 fois de suite sur le meme fichier
pourtant mon code est simple :
| CODE |
DWORD filesize(FILE *fp) { DWORD pos; DWORD pos_cur; pos_cur=ftell(fp); fseek(fp,0,SEEK_END); pos=ftell(fp); fseek(fp,pos_cur,SEEK_SET); return pos; }
FILE *fp; static BYTE *buf; // le buffer DWORD length_of_file;
fp=fopen(msg,"rb");
length_of_file = filesize(fp); buf = (BYTE *)malloc(length_of_file + 4); if (buf == NULL) exit_func("Pas assez de mémoire pour charger le fichier"); fread(buf, length_of_file, 1, fp); fclose (fp);
//traitement de buf
free(buf);
|
de quoi peut venir le pb ?
j'espere avoir ete clair...

merci
ps : je developpe sous windows
avec Devc++
oposs
12-07-2005 10:18:30
Qu'entends tu par "ça ne semble pas fonctionner 2 fois sur le même fichier" ?
Est-ce en relançant le programme, ou en faisant l'appel 2 fois dans le même programme.
Et qu'est ce qui ne fonctionne pas? Tu as un buffer vide ou un autre problème ?
mogwai93
13-07-2005 04:19:16
| QUOTE (oposs @ 12-07-2005 11:18:30) |
Qu'entends tu par "ça ne semble pas fonctionner 2 fois sur le même fichier" ?
Est-ce en relançant le programme, ou en faisant l'appel 2 fois dans le même programme. Et qu'est ce qui ne fonctionne pas? Tu as un buffer vide ou un autre problème ? |
c'est en executant le meme programme
j'ai un bouton qui me fait apparaitre une fenetre de selection
qui renseigne ici la variable msg
Scénario :
1 - lancement programme
2 - selection fichier 1
3 - affichage contenu fichier 1
4 - selection fichier 1
5 - affichage contenu fichier 1
...
n - quitter programme
mon probleme doit etre un probleme de buffer
dans certains cas, il est correct,
dans d'autres cas, ce sont des valeurs aléatoires
ici, 3 et 5 devraient etre identiques,
mais ce n'est pas toujours le cas....
oposs
13-07-2005 08:52:38
A priori, il n'y a pas de problème dans le code que tu as donné.
Mais le bug semble venir d'appels successifs. Est-ce que tu pourrais nous montrer un peu plus de code pour voir comment se font ces appels ?
Par exemple le fopen, la déclaration de buf, etc. sont-ils dans une fonction?
mogwai93
13-07-2005 16:56:21
| QUOTE (oposs @ 13-07-2005 09:52:38) |
A priori, il n'y a pas de problème dans le code que tu as donné.
Mais le bug semble venir d'appels successifs. Est-ce que tu pourrais nous montrer un peu plus de code pour voir comment se font ces appels ? Par exemple le fopen, la déclaration de buf, etc. sont-ils dans une fonction? |
voici un peu plus de code :
| CODE |
int Lire_fichier (HWND hWnd, FILE *fp) { static BYTE *buf; // le buffer DWORD length_of_file;
length_of_file = filesize(fp); buf = (BYTE *)malloc(length_of_file + 4); if (buf == NULL) exit_func("Pas assez de mémoire pour charger le fichier"); fread(buf, length_of_file, 1, fp); fclose (fp);
// traitement du buffer
}
bool LoadFile(char *path,char *ftitle) { OPENFILENAME ofn; char File[MAX_PATH]; char Title[MAX_PATH];
ZeroMemory(File,sizeof(File)); ZeroMemory(Title,sizeof(Title));
ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = GetActiveWindow(); ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = "Fichiers dune 2\0*.pak\0Tous les fichiers\0*.*\0\0"; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; //NULL; ofn.nFilterIndex = 0; ofn.lpstrFile = File; ofn.nMaxFile = sizeof(File); ofn.lpstrFileTitle = Title; ofn.nMaxFileTitle = sizeof(Title); ofn.lpstrInitialDir = NULL; ofn.lpstrTitle = "Ouvrir un fichier..."; ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; ofn.nFileOffset = 0; //NULL; ofn.nFileExtension = 0;//NULL; ofn.lpstrDefExt = "*.exe"; ofn.lCustData = 0; //NULL; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL;
if( !GetOpenFileName( &ofn ) ) { path[0] = 0; return false; }
CopyMemory(path,File,sizeof(File)); if( ftitle ) CopyMemory(ftitle,Title,sizeof(Title)); return true; }
BOOL CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { char msg[MAX_PATH]; bool ret; FILE *fp;
switch (message) /* handle the messages */ { case WM_CLOSE: EndDialog(hwnd,0); break;
case WM_COMMAND: switch( wParam ) { case IDC_LOAD1 : ret = LoadFile( msg,NULL ); if( ret ) { SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),msg); fp=fopen(msg,"rb"); if (fp==NULL) MessageBox (hwnd, "File not found ?", "File not found ?", MB_OK); else { SendMessage(GetDlgItem(hwnd, IDC_LIST2), LB_RESETCONTENT, 0,0); Lire_fichier (hwnd, fp); } } break; case IDC_QUIT : EndDialog(hwnd,0); break; } break; }
return false; }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i = DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)WindowProcedure );
if( i == -1 ) MessageBox(NULL,"Une erreur inattendue est survenue.","TITRE",MB_OK|MB_ICONSTOP);
return false; } |
je vais voir en mettant le fopen, le fread et le fclose dans la meme methode
EDIT : j'ai enfin trouvé
ca venait de la partie traitement, où une variable était mal déclarée
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez
cliquer ici.