Modifier des octets dans un fichier ?

Résolu
cs_supergrey Messages postés 475 Date d'inscription vendredi 27 juin 2003 Statut Membre Dernière intervention 20 septembre 2010 - 10 déc. 2004 à 16:31
 boumarsel - 14 déc. 2004 à 16:11
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 déc. 2004 à 16:39
CreateFile
SetFilePointer
WriteFile
CloseHandle

ciao...
BruNews, MVP VC++
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 18:44
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.
3
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
10 déc. 2004 à 16:57
Et bonjour le gain de vitesse... Si tu utilises le C standard : fopen, fseek, fprintf et fclose.
0
cs_supergrey Messages postés 475 Date d'inscription vendredi 27 juin 2003 Statut Membre Dernière intervention 20 septembre 2010
10 déc. 2004 à 18:17
ok merci je vais chercher un peu pour CreateFile,SetFilePointer,WriteFile,CloseHandle sinon si tu as un exemple je suis preneur...
0

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

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 18:21
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 déc. 2004 à 18:24
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++
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 18:53
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?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
10 déc. 2004 à 19:01
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
10 déc. 2004 à 19:03
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
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
10 déc. 2004 à 19:13
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.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 19:33
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... :)
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
10 déc. 2004 à 20:15
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...
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
10 déc. 2004 à 20:52
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 déc. 2004 à 21:02
DeAtHCrAsH > quel rapport entre le langage et la maniere directe ou non d'arriver jusqu'a l'API voulue ???

ciao...
BruNews, MVP VC++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
10 déc. 2004 à 22:47
Comment tu sais que les API sont écrites 100% en C, tu as les sources?
0
cs_supergrey Messages postés 475 Date d'inscription vendredi 27 juin 2003 Statut Membre Dernière intervention 20 septembre 2010
11 déc. 2004 à 11:47
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 !
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
11 déc. 2004 à 11:51
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 déc. 2004 à 11:53
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++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 déc. 2004 à 12:06
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++
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
11 déc. 2004 à 12:20
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
0
Rejoignez-nous