[C/C++] Lecture/Ecriture d'un Executable

Lecture/Ecriture d'un Executable [C/C++] - Programmation

Marsh Posté le 09-07-2001 à 23:14:53    

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?  
 
@+


---------------
PIKACHU !
Reply

Marsh Posté le 09-07-2001 à 23:14:53   

Reply

Marsh Posté le 10-07-2001 à 16:47:09    

24 visites et 0 reponses.... la question est peut etre trop compliquée...

Reply

Marsh Posté le 10-07-2001 à 18:43:28    

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...

Reply

Marsh Posté le 10-07-2001 à 23:43:42    

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

Reply

Marsh Posté le 11-07-2001 à 10:03:37    

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+

Reply

Marsh Posté le 11-07-2001 à 11:58:32    

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);
}

Reply

Marsh Posté le 11-07-2001 à 12:40:23    

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed