Posté(e) le 11 juillet 200519 a 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++
Posté(e) le 12 juillet 200519 a 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 ?
Posté(e) le 13 juillet 200519 a Auteur 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....
Posté(e) le 13 juillet 200519 a 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?
Posté(e) le 13 juillet 200519 a Auteur 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
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.