mogwai93 Posted July 11, 2005 Share Posted July 11, 2005 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 : 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++ Link to comment Share on other sites More sharing options...
oposs Posted July 12, 2005 Share Posted July 12, 2005 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 ? Link to comment Share on other sites More sharing options...
mogwai93 Posted July 13, 2005 Author Share Posted July 13, 2005 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.... Link to comment Share on other sites More sharing options...
oposs Posted July 13, 2005 Share Posted July 13, 2005 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? Link to comment Share on other sites More sharing options...
mogwai93 Posted July 13, 2005 Author Share Posted July 13, 2005 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 : 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 Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.