Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3948 connectés 

 


Dernière réponse
Sujet : [C/C++] Lecture/Ecriture d'un Executable
Toucouch Effectivement, avec un tampon, c'est beaucoup mieux... Mais allouer un bloc de 2Mo d'un coup, t'as pas peur toi! Quelques dizaines de ko c'est déjà pas mal...

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Toucouch Effectivement, avec un tampon, c'est beaucoup mieux... Mais allouer un bloc de 2Mo d'un coup, t'as pas peur toi! Quelques dizaines de ko c'est déjà pas mal...
TheNicow Autre chose, utiliser, la lecture/ecriture caractere par caractere, c'est pas tres astucieux.
Ca te fait perdre bcp de temps.
 
Il vaut mieux que tu utilises un buffer, par exemple 1 ou 2 Mo.
 
par exemple :
char buffer[2000000]; //bon d'accord cé pas vraiment 2Mo ;-))
 
int bytes_read = fread(buffer, sizeof(char), 2000000, lecture);
while(bytes_read > 0)
{
  fwrite(buffer, sizeof(char), bytes_read, ecriture);
  bytes_read = fread(buffer, sizeof(char), 2000000, lecture);
}
Toucouch C'est quoi le but du jeu? Utiliser le moins d'octets possible pour tn source? Tu peux aussi te dispenser de sauter des lignes (le compilo s'en fout) et nommer toutes tes variables avec un seul caractère... :D
 
Non, sérieux, ça dépend de ce que tu fais, mais si tu dois faire un code qui est susceptible d'être relu par un autre (ou par toi-même plus tard!) tu as intérêt à aérer...
 
Et d'ailleurs, il y a plus court pour ta condition while:

Code :
  1. while(fread(&a,1,1,lecture))


Puisque fread te retourne le nombre d'octets effectivement lus, et que lorsqu'il est à la fin, il n'en lit aucun et retourne 0... ;)
 
Et pendant que j'y suis, tu peux encore gagner de la place et du temps en te dispensant de demander à l'utilisateur d'entrer les 2 noms de fichiers: tu les prends directement en arguments:

Code :
  1. int main(int argc,char *argv[])
  2. {
  3. ...
  4. lecture = fopen(argv[1],"rb" ); 
  5. ecriture = fopen(argv[2],"wb" ); 
  6. ...


 
A+

Pikkachu oui tu as raison le probleme etait dans cette ligne:
while(fread(&a,sizeof(char),1,lecture),!feof(lecture))  
 
je l'ai finalement remplacé par:
while(fread(&a,sizeof(char),1,lecture)&&!feof(lecture))
c'est plus court que ce que tu propose
 
gets et puts sont plus rapide que printf et scanf car ils font aucune verification
Toucouch Alors, j'ai essayé de compiler ton truc:
 
1. J'avais jamais utilisé puts et gets mais le compilo me met texto "The use of gets is dangerous...". Donc, je pense qu'il vaudrait mieux lui préférer un scanf ou mieux, l'utilisation des paramètres de main...
 
2. Quand tu ouvres des fichiers, teste si l'ouverture s'est effectuée sans problème, ça ne coûte pas grand chose, et ça peut t'aider à comprendre quand ça ne marche pas...
 
3.

Code :
  1. while(fread(&a,sizeof(char),1,lecture),!feof(lecture))


Là, je dois dire que c'est particulièrement illisible... Je ne savais même pas qu'un compilo autorisait ça... Pourtant, je suis loin d'être un maniaque...
 
 
Donc, après nettoyage, j'ai ça:

Code :
  1. #include "stdio.h"
  2. int main(int argc,char *argv[])
  3. {
  4.   char fichier[25],fichier2[25];
  5.   FILE *lecture,*ecriture;
  6.   char a;
  7.   // addresse des fichiers .exe ou autre  
  8.   printf("Addresse du fichier a lire : " );
  9.   scanf("%s",fichier);
  10.   printf("\nAddresse du fichier a ecrire : " );
  11.   scanf("%s",fichier2);
  12.   // ouverture en mode binaire  
  13.   if(!(lecture = fopen(fichier,"rb" )))
  14.     {
  15.       printf("Ouverture de %s impossible.\n",fichier);
  16.       return 1;
  17.     }
  18.   if(!(ecriture = fopen(fichier2,"wb" )))
  19.     {
  20.       printf("Ouverture de %s impossible.\n",fichier2);
  21.       return 1;
  22.     }
  23.   // copie du fichier de l'adresse1 à l'addresse2  
  24.   fread(&a,sizeof(char),1,lecture);
  25.   while(!feof(lecture))
  26.     {
  27.       fwrite(&a,sizeof(char),1,ecriture);
  28.       fread(&a,sizeof(char),1,lecture);
  29.     }
  30.   // fermeture des fichiers  
  31.   fclose(lecture);
  32.   close(ecriture);
  33. }

 
 
Et ça marche...

Pikkachu 24 visites et 0 reponses.... la question est peut etre trop compliquée...
Pikkachu 1.Je cherche à copier un fichier .exe à une autre addresse dans le disque dur mais ca fonctionne pas meme en mode binaire  
 
#include "stdio.h"  
 
void main()  
{  
 
char fichier[25],fichier2[25];  
FILE *lecture,*ecriture;  
char a;  
 
// addresse des fichiers .exe ou autre  
puts("Addresse du fichier a lire : " );  
gets(fichier);  
puts("\nAddresse du fichier a ecrire : " );  
gets(fichier2);  
 
// ouverture en mode binaire  
lecture = fopen(fichier,"rb" );  
ecriture = fopen(fichier2,"wb" );  
 
// copie du fichier de l'adresse1 à l'addresse2  
while(fread(&a,sizeof(char),1,lecture),!feof(lecture))  
{fwrite(&a,sizeof(char),1,ecriture);}  
 
// fermeture des fichiers  
fclose(lecture);  
fclose(ecriture);  
 
}  
 
Pourquoi ca fonctionne pas?
 
2.Comment gerer les caractere dans les fichiers exe car ils n'existent pas dans le clavier?  
Je cherche à faire un programme de compression qui remplace les caracteres repetes plusieurs fois de suite par un chiffre suivi du carctere repeté c'est à faire pour un fichier texte car les caracteres sont gerables (sur le clavier) mais comment faire pour les executables?  
 
@+

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)