Filemapping

[Résolu]
Signaler
Messages postés
116
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
26 janvier 2008
-
Messages postés
116
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
26 janvier 2008
-
bonjour,

j'ai besoin d'aide car je ne sais pas lire un "buffer" octet par octet pour traiter chaque octet un par un à la lecture d'un fichier binaire.
Après pas mal de recherches j'ai lu (http://www.developpez.net/forums/archive/index.php/t-2566.html) qu'il était plus rapide d'utiliser le filemapping pour la lecture de gros fichier alors j'ai repris un tuto ici : http://perso.orange.fr/luce.yves/_tut13.html que j'ai traduit ci-dessous ->

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
HANDLE fichierlu;
HANDLE fichiermap;
HANDLE crefichier;
LPCTSTR pmem;
DWORD taille;
DWORD taillecri;

fichierlu = CreateFile("test.bin",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL);
fichiermap = CreateFileMapping(fichierlu,NULL,PAGE_READONLY,0,0,NULL);
pmem = (LPTSTR)MapViewOfFile(fichiermap,FILE_MAP_READ,0,0,0);
crefichier = CreateFile("test2.bin",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
taille = GetFileSize(fichierlu,NULL);
WriteFile(crefichier,pmem,taille,&taillecri,NULL);
printf("%d octets\n",taillecri);
UnmapViewOfFile(&pmem);

CloseHandle(fichierlu);
CloseHandle(fichiermap);
CloseHandle(crefichier);

system("PAUSE");
return 0;
}

malheureusement le tuto ne va pas plus loin que la simple copie de fichier utilisant le file mapping. mon soucis maintenant c'est comment lire "pmem" octet par octet ? comment naviguer dedans ? s'il vous plait, merci d'avance !</stdio.h></windows.h>

4 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Tu peux faire:
BYTE* pmem;
ensuite:
pmem=(BYTE*) MapViewOfFile(....
Ainsi tu pourras naviguer dans la zone mémoire commençant par pmem octet par octet.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Je pense que tu dois changer:

LPCTSTR pmem; 
par

LPCSTR pmem;

pour éviter tout problème causé par Unicode

Puis:

pmem = (LPCSTR)MapViewOfFile(fichiermap, FILE_MAP_READ, 0, 0, 0);






Enfin:

Tu parcours ton tableau octet par octet:

for (int index=0; index<taille; ++index) {
    // travailler avec l'octet pmem [index]
}
Messages postés
116
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
26 janvier 2008

Je suis désolé FireFox n'a pas mis les retours à la ligne je double post donc :-/

bonjour, j'ai besoin d'aide car je ne sais pas lire un "buffer" octet par octet pour traiter chaque octet un par un à la lecture d'un fichier binaire. Après pas mal de recherches j'ai lu (http://www.developpez.net/forums/archive/index.php/t-2566.html) qu'il était plus rapide d'utiliser le filemapping pour la lecture de gros fichier.
Alors j'ai repris un tuto ici : http://perso.orange.fr/luce.yves/_tut13.html que j'ai traduit ci-dessous ->

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
HANDLE fichierlu;
HANDLE fichiermap;
HANDLE crefichier;
LPCTSTR pmem;
DWORD taille;
DWORD taillecri;

fichierlu = CreateFile("test.bin",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL);
fichiermap = CreateFileMapping(fichierlu,NULL,PAGE_READONLY,0,0,NULL);
pmem = (LPTSTR)MapViewOfFile(fichiermap,FILE_MAP_READ,0,0,0);
crefichier = CreateFile("test2.bin",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
taille = GetFileSize(fichierlu,NULL);
WriteFile(crefichier,pmem,taille,&taillecri,NULL);
printf("%d octets\n",taillecri);
UnmapViewOfFile(&pmem);

CloseHandle(fichierlu);
CloseHandle(fichiermap);
CloseHandle(crefichier);

system("PAUSE");
return 0;
}

malheureusement le tuto ne va pas plus loin que la simple copie de fichier utilisant le file mapping. mon soucis maintenant c'est comment lire "pmem" octet par octet ? comment naviguer dedans ? s'il vous plait, merci d'avance !
Messages postés
116
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
26 janvier 2008

Gé ni al -> ça marche du tonnerre! merci à vous de vôtre précieuse aide!
A bientôt :-)