Probleme dans la lecture d'un fichier [Résolu]

Signaler
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007
-
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007
-
bonjour,
voila je cherche a ouvrir un fichier bmp et mon code ne semble pas avoir accés a tout le fichier je m'en remet a vous pour savoir si cela est normal merci d'avance.
if (GetOpenFileName(&ofn)==TRUE)
{
HANDLE fo;
DWORD lenbloc,s;
char tampon[1146881],temp[1146881];
int i;
nbfichier++;//incremente le nombre total de fichier
//on ouvre le fichier
fo = CreateFile(ofn.lpstrFile, GENERIC_READ, 0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(fo == INVALID_HANDLE_VALUE)return 1;//on verifie que le fichier est ouvert
lenbloc = 1146880 ;//recupere la taille du fichier
tampon = (char) malloc(lenbloc); //alloue la taille du tampon
ReadFile(fo, tampon, lenbloc, &s, NULL);//lit le fichier et place son contenu dans tampon
fichier[1][lenbloc+1]=0;
for(i=0;i<=lenbloc+1;i++) temp[i]= fichier[1][i];
tampon[lenbloc+1]=0;//place le carractere de fin de chaine a la fin du tampon
free(tampon);//reinitialise le tampon
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM) ofn.lpstrFile);//affiche en haut de la fenetre le chemin et le nom du fichier ouvert
CloseHandle(fo);//ferme le fichier
}

14 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
LPVOID pmem = 0;
DWORD size, d;
fo = CreateFile(ofn.lpstrFile,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
if(fo == INVALID_HANDLE_VALUE) return 1; // ERREUR OUVERTURE
size = GetFileSize(fo, 0);
if(!size || GetLstError()) goto closeFL;
pmem = VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE);
if(!pmem) goto closeFL;
d = 0; ReadFile(fo, pmem, size, &d, 0);
if(d != size) {
VirtualFree(pmem, 0, MEM_RELEASE);
pmem = 0;
}
closeFL:
CloseHandle(fo);


A ce point si pmem != 0 tu as les octets du fichier dans pmem sur une longueur size.
Pourquoi mettre un zero au bout de pmem ???

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ne pas déclarer d'aussi gros buffers locaux, faut alloc dynamique:
char tampon[1146881],temp[1146881];
ensuite on voit plus bas: tampon = (char) malloc(...) ??? faudrait savoir
et (char), serait pas (char*) plutot ?

tampon[lenbloc+1]=0; selon le malloc tu écris hors tableau, ecrasement de données.
surtout que suivi de: free(tampon); ça ne me semble pas utile ce qui est plus haut.

et, etc...

Donne plutot le but à atteindre, on verra ce qu'on peut faire.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

en fait ce serai pour stoquer les données dans un tableau dans le but de les lires par la suite
a +
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

en fait j'ai fait un mélange des codes que j'ai trouvé, le zero je crois me souvenir que c'était pour marquer la fin de mon tableau mais bon c'est vrai que c'est inutile je vais utiliser ton ton code merci beaucoup
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

re moi il ne reconnait pas GetLstError c'est dans quelle librairie?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
GetLastError()
pas évident de taper dans cet éditeur, faut savoir aussi interpréter les fautes de frappe...

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

je suis trop nul merci
fabian
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE); je crois qu'il manque un argument mais je ne voit pas lequel
fabian
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
OUPS: PAGE_READWRITE en dernier, dur dur...

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
et n'oublie pas de libérer avec VirtualFree() quand fini avec le buffer pmem (SI != 0 en sortie).

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

et bien merci ca a l'air de marcher pour cette partie du programme
a bientot
fabian
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

Bonjour je n'arrive pas à récupérer ce qu'il y a dans pmem et surtout je n'arrive pas a travailler avec les valeur du tableau. Si j'ai bien compris pmem est un tableau de pointeur de type void comment faire pour récupérer un tableau de type char dont je saurai me servir merci d'avance. Fabian
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
NON pas un tableau de pointeurs mais un simple tableau.
Un simple cast comme d'habitude suffit:
char *c = (char*) pmem;
Si tu veux un 0 final, alloue size+1, VirtualAlloc aura déjà initialisé pour toi la zone mémoire avec des 0.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
14
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
26 mai 2007

merci pour les conseils je reviendrai peut etre pour d'autre questions a plus
fabian