Probleme dans la lecture d'un fichier

Résolu
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007 - 11 mars 2006 à 23:22
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007 - 16 mars 2006 à 13:39
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mars 2006 à 00:32
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++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mars 2006 à 23:41
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++
0
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
11 mars 2006 à 23:46
en fait ce serai pour stoquer les données dans un tableau dans le but de les lires par la suite
a +
0
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
12 mars 2006 à 00:38
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
12 mars 2006 à 01:00
re moi il ne reconnait pas GetLstError c'est dans quelle librairie?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mars 2006 à 01:04
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++
0
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
12 mars 2006 à 01:06
je suis trop nul merci
fabian
0
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
12 mars 2006 à 01:17
VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE); je crois qu'il manque un argument mais je ne voit pas lequel
fabian
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mars 2006 à 01:26
OUPS: PAGE_READWRITE en dernier, dur dur...

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mars 2006 à 01:28
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++
0
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
12 mars 2006 à 01:35
et bien merci ca a l'air de marcher pour cette partie du programme
a bientot
fabian
0
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
13 mars 2006 à 13:12
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mars 2006 à 13:38
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++
0
jack_ryan Messages postés 14 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 26 mai 2007
16 mars 2006 à 13:39
merci pour les conseils je reviendrai peut etre pour d'autre questions a plus
fabian
0
Rejoignez-nous