Filemapping

Résolu
skotmarud Messages postés 116 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 26 janvier 2008 - 9 nov. 2006 à 21:49
skotmarud Messages postés 116 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 26 janvier 2008 - 10 nov. 2006 à 01:13
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

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 nov. 2006 à 23:12
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.
3
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
9 nov. 2006 à 23:12
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]
}
3
skotmarud Messages postés 116 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 26 janvier 2008
9 nov. 2006 à 21:59
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 !
0
skotmarud Messages postés 116 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 26 janvier 2008
10 nov. 2006 à 01:13
Gé ni al -> ça marche du tonnerre! merci à vous de vôtre précieuse aide!
A bientôt :-)
0
Rejoignez-nous