Modifier des octets dans un fichier ? [Résolu]

Signaler
Messages postés
475
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
20 septembre 2010
-
 boumarsel -
Salut, je voudrais savoir comment modifier des octets au milieu d'un fichier, jusqu'ici je recopier tout le fichier en changeant les octet voulu mais ca me pose probleme pour de gros fichier.
Merci!

48 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
CreateFile
SetFilePointer
WriteFile
CloseHandle

ciao...
BruNews, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Voici un petit exemple:
HANDLE hFichier;
hFichier =CreateFile("nomfichier.bin",.......
long position=1000;
SetFilePointer(hFichier,position,0,FILE_BEGIN);
BYTE octet=0x1F;
DWORD ecrits=0;
WriteFile(hFichier, &octet,1,&ecrits,0);
CloseHandle(hFichier);

Dans cet exemple, le pointeur du fichier est positionné à 1000 à partir du début. Puis on écrit l'octet 0x1F à cette position. L'ancien octect est écrasé. Si la taille du fichier est trop grande (+ de 4Go) tu devras utiliser aussi le 3ème paramètre de la fonction SetFilePointer(). Si la position désirée est plus proche de la fin, il est préférable de remplacer FILE_BEGIN par FILE_END. Dans ce cas "position" doit être négatif.
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Et bonjour le gain de vitesse... Si tu utilises le C standard : fopen, fseek, fprintf et fclose.
Messages postés
475
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
20 septembre 2010

ok merci je vais chercher un peu pour CreateFile,SetFilePointer,WriteFile,CloseHandle sinon si tu as un exemple je suis preneur...
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Nebula > Tu es sûr que les fonctions du C Standard sont plus rapides? Si oui comment expliquer cela? Moi je pensais toujours que les APIs sont les plus rapides. J'aimerais bien en avoir le coeur net.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
racpp > les propos de Nebula vont bien dans le meme sens, il serait d'ailleurs impossible qu'il en fut autrement.

ciao...
BruNews, MVP VC++
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
BruNews > Ok. Je ne sais pas pourquoi beaucoup de gens pensent que les fonctions du C Standard sont toujours plus rapides. Y'a-t-il des cas où cela pourrait être vrai?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Eventuellement pour des fonction C qui n'utilisent pas d'API!
Par exemple sprintf est peut être plus rapide que wsprintf, par contre malloc qui utilisse HeapAlloc ne pourrait être plus rapide, elle est forcément plus lente
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Comme rapcpp, j'interprète le message de Nebula comme suit:
pour le gain de vitesse ne pas utiliser les API mais les fonction C runtime
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Mouais ben non, raté.

Et bonjour le gain de vitesse... >> modifier des octets sans avoir à se taper la copie du fichier pour changer trois octets à la fin, API ou CRT c'est déjà une bonne optimisation non (sans commentaires)

Si tu utilises le C standard : fopen, fseek, fprintf et fclose. >> au cas où il serait pas sous Windows, évidemment API sinon !

Ahlala.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Nebula > Voilà, maintenant c'est plus clair, je suis tout à fait d'accord. Si tu avais bien séparé le commentaire du conseil, il n'y aurait pas de fausse interprétation... :)
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Et s'il avait donné le système, je n'aurais rien précisé. On tourne en rond ;-)

Par ailleurs je ne vois pas où j'ai été "imprécis", BruNews a d'ailleurs bien compris le sens de mes propos. Çà dépend plus de la manière dont on interprète la jonction entre les phrases :-/

Enfin, la prochaine fois je mettrais "au cas où" plutôt que "si", çà prêtera moins à confusion...
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Je me permet de vous faire remarquer que les API sont 100% en C.

Tout reste dans la manière de coder les choses.

Shell
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
DeAtHCrAsH > quel rapport entre le langage et la maniere directe ou non d'arriver jusqu'a l'API voulue ???

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Comment tu sais que les API sont écrites 100% en C, tu as les sources?
Messages postés
475
Date d'inscription
vendredi 27 juin 2003
Statut
Membre
Dernière intervention
20 septembre 2010

Voila ce que j'ai fait pour copier un fichier (je sais que ce n'est pas du tout la bonne methode pour le faire mais je voudrais savoir pourquoi ca ne marche pas car j'ai besoin de pouvoir pointer ou je veux dans le fichier en lecture comme en écriture):

HANDLE HDLWRITE;
HDLWRITE=CreateFile("copievideo.mpg", GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_FLAG_SEQUENTIAL_SCAN, 0);

HANDLE HDLREAD;
HDLREAD=CreateFile("video.mpg", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
SetFilePointer(HDLREAD, 0, 0, FILE_BEGIN);

DWORD data=0,k;

while(ReadFile(HDLREAD, &data, 1, &k, 0) && k>0)
{
SetFilePointer(HDLREAD, nooctet, 0, FILE_BEGIN);
SetFilePointer(HDLWRITE, nooctet, 0, FILE_BEGIN);
WriteFile(HDLWRITE, &data, 1, &k, 0);
nooctet++;
}

CloseHandle(HDLREAD);
CloseHandle(HDLWRITE);

Merci !
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
BruNews> C'est pas dans ce sens que je le disais.
Je fesais juste remarquer qu'un programme peut etre coder de différente maniere API ou non.

Il peut se servir des API mais niveau performances il y aura un gros écart entre celui qui lis octet par octet et celui qui lit 64octets par 64octets.

Après API ou non tout dépend de ce qu'il recherche.
Comme me disais mon prof, ce n'est pas parcequ'un programme marche qu'il est bon.

vecchio> J'avais lu ca quelque part. BruNews confirmera tu mes dires ?

Shell
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Le 1er SetFilePointer() est inutile, tu es par force au debut en ouvrant le fichier.

Je ne vois pas non plus a quoi servent les autres pour une copie, tant qu'on a des octets on les ecrit.

ciao...
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
Les APIs de base du systeme (pas GDI+ et autres trucs de haut niveau) sont toutes "ecrites" en C pour assurer une maintenance aisee, beaucoup d'entre elles (GDI par exemple) repassent quasi illico les operations a des routines entierement en ASM.
Rassurons vecchio: jamais vu la moindre API ecrite en VB (on plaisante...).

ciao...
BruNews, MVP VC++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
supergrey> Il y a un truc que tu n'as pas bien compris apparement.
SetFilePointer permet de déplacer un pointeur sur un flux.

Seuleument, quand tu lis ou écrit dans un fichier qui reste ouvert, le déplacement du pointeur est automatique, et se met au dernier octet écrit ou lus.

C'est pourquoi BruNews te dis que les 2 SetFilePointer de ta boucle son inutile.

Puis si tu souhaites copier de gros fichier, ne le fait pas octet par octet, sinon t'en auras pour une plombe.
Fait une copie par bloc d'octet.

Shell