mogwai93 Posté(e) le 11 juillet 2005 Partager Posté(e) le 11 juillet 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++ Lien vers le commentaire Partager sur d’autres sites More sharing options...
oposs Posté(e) le 12 juillet 2005 Partager Posté(e) le 12 juillet 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 ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 13 juillet 2005 Auteur Partager Posté(e) le 13 juillet 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.... Lien vers le commentaire Partager sur d’autres sites More sharing options...
oposs Posté(e) le 13 juillet 2005 Partager Posté(e) le 13 juillet 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? Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 13 juillet 2005 Auteur Partager Posté(e) le 13 juillet 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.