Lire les 6 dernier octets d'un fichier?

Résolu
Signaler
Messages postés
475
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
20 septembre 2010
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Bonjour, je souhaite lire les 6 derniers octets d'un fichier j'ai écris le code suivant mais ca n'a pas l'air de marché car byteread est à zéro:

 char IDWEB[6];
 DWORD byteread=0;


 DWORD taille = 0;
 HANDLE hfl = CreateFile("temp", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 SetFilePointer(hfl,5,NULL,FILE_END);
 ReadFile(hfl,IDWEB,6,&byteread,NULL);
 CloseHandle(hfl);

Bon je ne suis pas sur s'il faut mettre 5 ou 6 pour setfilepointer mais je ne pense pas que le probleme vienne de la.


 


Merci

5 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Pour lire 6 octets, il suffit d'en réserver 6 (le zéro terminal n'est pas obligatoire).
Je pense qu'il faut mettre -6 dans SetFilePointer, car 0 fin, -1 1 avant la fin, donc -6 = 6 avant la fin
Regarde si ton hfl est bien valide, peut être que CreateFile a échoué

Ca ne semble pas être FILE_FLAG_SEQUENTIAL_SCAN qui pose problème, cependant tu devrais l'enlever, car il est déconseillé quand tu fais des déplacement aléatoires dans le fichier (If an application moves the file pointer for random access, optimum caching may not occur. However, correct operation is still guaranteed.)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Salut vecchio. Pour SetFilePointer, c'est exactement ce que je disais. Ensuite si je reserve une place pour le 0 terminal c'est que j'ai tester ce que j'ai écrit et sans 0 terminal, toute sorte de caractère s'écrive après les 6 derniers. D'accord si c'est seulement pour "traiter" les 6 caractères indépendament mais si il veut affichers la chaine avec printf ou autre, c'est là que le problème apparaitra. Ce n'est qu'une précotion de ma part.
___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
char IDWEB[7];
 DWORD byteread0;  DWORD taille 0;
 HANDLE hfl = CreateFile("temp", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 SetFilePointer(hfl,-6,NULL,FILE_END);
 ReadFile(hfl,IDWEB,6,&byteread,NULL);
 CloseHandle(hfl);
IDWEB[6] = 0;

essais ça

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Et si tu n'est pas sûr de la taille, je te conseillerais de tester la taille avant d'éfectuer une lecture:

if(GetFileSize(hfl, 0) < 6)
{
        MessageBox(0, "Taille du fichier insufisante", "Problème", MB_ICONHAND);
        CloseHandle(hfl);
        return 0;
}

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
475
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
20 septembre 2010

Ok, merci. Par contre pourquoi pas faire:
char IDWEB[6];
 DWORD byteread=0;  DWORD taille = 0;
 HANDLE hfl = CreateFile("temp", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 SetFilePointer(hfl,-6,NULL,FILE_END);
 ReadFile(hfl,IDWEB,6,&byteread,NULL);
 CloseHandle(hfl);