Overflow in implicit constant conversion: Veut dire?

Bonjour, j'écris une fonction qui lit du "faux hexa" dans un fichier texte. Le 1er hexa étant la taille. Mais j'ai quelque problème lors de la compilation:

Je vous 2 possibles erreurs, ma ligne:
if(c>='A' || c<='F') c=('F'-'lettre'+15);
Mais je ne vois pas comment faire autrement.
et mon fwrite (qui est le 1er que je fait donc surement une erreur)
fwrite(lettre, 1 * sizeof(int), 1, fichier_Bin);

lab.c:45: warning: overflow in implicit constant conversion
lab.c:69: warning: passing arg 1 of 'fwrite' makes pointer from integer without a cast
lab.c:87: error: parse error at end of input


#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>

#define fichierTexteHexa "hexa2.txt"
#define fichierBinaire "fichier.dat"
#define fichieTexte "fichier.txt"

/**
* Pré:
* @param fichierBin contier l'adresse d'un fichier binaire
* @param fichierHex contient un ficher texte contenant de l'hexadecimal
* Post:
* @param fichierBin contiendra l'hexa traitée
* @param fichierHex est inchangé
**/
void HexaToBin(char * fichierBin, char * fichierHex){
	
	FILE * fichier_Bin;
		//on ouvre le fichier binaire pour y écrire si il y a quelque chose on écrase les info
		if ((fichier_Bin = fopen(fichierBin,"wb"))==NULL) {
        perror("Write "); 
        exit(1);
		}
	
	FILE * fichier_Hex;
		
		//on ouvre le fichierHex pour lire les info dedans
		if ((fichier_Hex = fopen(fichierHex,"r"))==NULL) {
        perror("Read "); 
        exit(1);
		}
		int taille=0,i=0,j=0;
	    char c;
		
		/*temps que on n'as pas atteint la fin du fichier on lit*/
		while(c!=EOF){ 

		c=fgetc(fichier_Hex);  //on lit le charactère où se trouve le pointeur dans le fichier
			
			if(c>='A' || c<='F') c=('F'-'lettre'+15); //on transforme les lettres en chiffres
			
			if(i<2){ //les 2 premiers char donne la taille de la ligne
			taille=taille+c;
			i++;
			}
			if(i==2){
				int test_pair=taille%2; //on vérifie si la ligne contient un nombre paire ou impair de char
					if(test_pair==1) taille--;
			}
			
			if(i==2){
			int lettre;
			int l;
				while(j<taille){
				 lettre=fgetc(fichier_Hex); 
					if (l<2){
					lettre=lettre+c;
					l++;
					if(l==1) lettre=lettre*16;
					}
				    
					if (l==2){
					//fwrite(fichier_Bin,"%d",lettre);
					fwrite(lettre, 1 * sizeof(int), 1, fichier_Bin);  
					l=0;
					lettre=0;
					}
				 j++;
				 i=0;
				}
			}
		
        } 

int main (void){

	printf("Travail n°4, en C\n");
	
	HexaToBin(fichierBinaire,fichierTexteHexa);

return 0;
}


J'ai poster l'intégralité du code au cas où mais je suppose que seul les 2 lignes cité contiennent une erreur. J'ai lu de la docu sure le fwrite mais je suis pas sur de ma ligne

3 réponses

  1. J'ai corriger encore de nombreuse erreur mais voila que je boucle sans arrêt alors j'ai ajouter une modification pour finir mais toujours rien dans mon fichier.txt
    Pourtant ca devrait enregistrer mais j'ai un problème avec la lecture de taille rien n'y fait j'ai des problèmes partout:

    taille 1/taille 2/ligne, 119J vaut 2taille 5/ligne, 102J vaut 2ligne, 238J vaut 4ligne, 34J vaut 6taille 0/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 119J vaut 6taille 8/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 102J vaut 6ligne, 221J vaut 8ligne, 119J vaut 10ligne, 0J vaut 12ligne, 102J vaut 14taille 12/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 34J vaut 6ligne, 0J vaut 8ligne, 119J vaut 10ligne, 51J vaut 12ligne, 102J vaut 14ligne, 153J vaut 16ligne, 102J vaut 18ligne, 221J vaut 20ligne, 119J vaut 22ligne, 0J vaut 24ligne, 102J vaut 26taille 12/ligne, 102J vaut 2ligne, 85J vaut 4ligne, 34J vaut 6ligne, 238J vaut 8ligne, -833J vaut 10ligne, -833J vaut 12ligne, -833J vaut 14ligne, -833J vaut 16ligne, -833J vaut 18ligne, -833J vaut 20ligne, -833J vaut 22ligne, -833J vaut 24ligne, -833J vaut 26ligne, -833J vaut 28ligne, -833J vaut 30ligne, -833J vaut 32ligne, -833J vaut 34ligne, -833J vaut 36ligne, -833J vaut 38taille -49/b


    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
    #include <fcntl.h>
    
    #define fichierTexteHexa "hexa2.txt"
    #define fichierBinaire "fichier.dat"
    #define fichierTexte "fichier.txt"
    
    /**
    * Pré:
    * @param fichierBin contier l'adresse d'un fichier binaire
    * @param fichierHex contient un ficher texte contenant de l'hexadecimal
    * Post:
    * @param fichierBin contiendra l'hexa traitée
    * @param fichierHex est inchangé
    **/
    void HexaToBin(char * fichierBin, char * fichierHex){
    	
    	FILE * fichier_Bin;
    		//on ouvre le fichier binaire pour y écrire si il y a quelque chose on écrase les info
    		if ((fichier_Bin = fopen(fichierBin,"wb"))==NULL) {
            perror("Write "); 
            exit(1);
    		}
    	
    	FILE * fichier_Hex;
    		
    		//on ouvre le fichierHex pour lire les info dedans
    		if ((fichier_Hex = fopen(fichierHex,"r"))==NULL) {
            perror("Read "); 
            exit(1);
    		}
    		int taille=0,i=1,j=0;
    	    int c;
    		
    		/*temps que on n'as pas atteint la fin du fichier on lit*/
    		while(c!=EOF){ 
    
    		c=fgetc(fichier_Hex);  //on lit le charactère où se trouve le pointeur dans le fichier
    		
    			if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres
    			else c=c-'0';
    			if(i=1){ //les 2 premiers char donne la taille de la ligne
    			taille*16;
    			i++;
    			}
    			if(i==2){
    					taille=taille+c;
    					int test_pair=taille%2; //on vérifie si la ligne contient un nombre paire ou impair de char
    					if(test_pair==1) taille--;
    					printf("taille %d\n",c);
    			if (c==-49) c=EOF;
    			
    			int lettre;
    			int l=1;
    			int temp;
    				while(j<taille){
    				 lettre=fgetc(fichier_Hex);
    				 j++;
    				 if(lettre>='A' && lettre<='F') lettre=lettre-'A'+10;
    				 
    				 else lettre=lettre-'0';
    					
    					if(l==1) {
    					temp=lettre*16;
    					l++;
    					}
    				    
    					if (l==2){
    					lettre=lettre+temp;
    					fwrite(&lettre, 1 * sizeof(int), 1, fichier_Bin);
    					printf("ligne, %d",lettre);
    					l=1;
    					lettre=0;
    					}
    				 j++;
    				 printf("J vaut %d",j);
    				 i=0;
    				}
    			j=0;
    			}
    
            } 
    	fclose(fichier_Hex);
    	fclose(fichier_Bin);
    	}
    
    /**
    * Pré:
    * @param fichierBin contier l'adresse d'un fichier binaire remplie
    * @param fichierTxt contient un ficher texte vide où remplie (mais sera écraser);
    * Post:
    * @param fichierBin est inchangé
    * @param fichierTxt contiendra du texte
    **/
    void BinToTexte(char * fichierBin, char * fichierTxt){
    	
    	FILE * fichier_Bin;
    		//on ouvre le fichier binaire pour lire le contenu
    		if ((fichier_Bin = fopen(fichierBin,"rb"))==NULL) {
            perror("Read "); 
            exit(1);
    		}
    	
    	FILE * fichier_Txt;
    		
    		//on ouvre le fichierTexte pour y écrire
    		if ((fichier_Txt = fopen(fichierTxt,"w"))==NULL) {
            perror("Write "); 
            exit(1);
    		}	
    	
    	int lettre;
    	
    		while (fread(&lettre,sizeof(int),1,fichier_Bin)){
             //fwrite(&lettre, 1 * sizeof(int), 1, fichier_Txt);  
    		//fprintf(fichier_Txt,%c,lettre);
    		fread(&lettre, 1 * sizeof(int), 1, fichier_Txt);
    		}
    		
    	fclose(fichier_Txt);
    	fclose(fichier_Bin);
    	}
    	
    	
    int main (void){
    
    	printf("Travail n°4, en C\n");
    	
    	/* conversion faux hexadecimal en binaire */
    	HexaToBin(fichierBinaire,fichierTexteHexa);
    	/* Conversion binaire en texte lisible */
    	BinToTexte(fichierBinaire,fichierTexte);
    	
    return 0;
    }
    
    
    0
    1. vu que je peux pas modifier mon dernier post (pas trouver pourquoi) j'ai décider de refaire tout ma procédure a zéro car a force de modifier comme un cochon je m'y retrouvais plus.

      J'ai réussi a écrire dans le .dat des plus bizarre les uns que les autres mais je n'ai aucune idée si cela est normal. Par contre rien ne s'écrit dans mon .txt et sa m'empèche de vérifier si la 1er procédure est just ou fausse. Si vous avez une idée je suis tout ouïe

      #include <stdio.h>
      #include <stdlib.h>
      #include <sys/wait.h>
      #include <unistd.h>
      #include <sys/types.h>
      #include <string.h>
      #include <fcntl.h>
      
      #define fichierTexteHexa "hexa1.txt"
      #define fichierBinaire "fichier.dat"
      #define fichierTexte "fichier.txt"
      
      void HexaToBin(char * fichierBin, char * fichierHex){
      	
      	FILE * fichier_Bin;
      		//on ouvre le fichier binaire pour y écrire si il y a quelque chose on écrase les info
      		if ((fichier_Bin = fopen(fichierBin,"wb"))==NULL) {
              perror("Write "); 
              exit(1);
      		}
      	
      	FILE * fichier_Hex;
      		
      		//on ouvre le fichierHex pour lire les info dedans
      		if ((fichier_Hex = fopen(fichierHex,"r"))==NULL) {
              perror("Read "); 
              exit(1);
      		}
      		
      		
      		int temp=0, c;
      		c=fgetc(fichier_Hex); //on vérifie en 1er si le fichier est vide 
      		
      		if(c!=EOF){ //si il ne l'est pas on commence a calculer la taille
      			if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres
      			else c=c-'0';
      			temp=c*16;
      		}
      		
      		int taille=0, i=1; 
      		char sortir='n';
      		/*temps que on n'as pas atteint la fin du fichier on lit*/
      		while(c!=EOF && sortir=='n'){ 
      
      			while(i<2){ //On regarde la taille de la ligne
      				c=fgetc(fichier_Hex);  //on lit le charactère où se trouve le pointeur dans le fichier
      				i++;
      			
      				if(c==EOF) sortir='o';
      			
      				if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres
      				else c=c-'0';
      			
      				if (i==1) temp=c*16;
      				else {
      					taille=temp+c;
      					int test_pair=taille%2; //on vérifie si la ligne contient un nombre paire ou impair de char
      					if(test_pair==1) taille--;
      				}
      			}
      		i=0;
      		
      			while(i<taille && sortir=='n'){
      			
      				c=fgetc(fichier_Hex);  //on lit le charactère où se trouve le pointeur dans le fichier
      				i++;
      			
      				if(c>='A' && c<='F') c=c-'A'+10; //on transforme les lettres en chiffres
      				else c=c-'0';
      			
      				if (i==1) temp=c*16;
      				else {
      				temp=temp+c;
      				fwrite(&temp, 1 * sizeof(int), 1, fichier_Bin);
      				}
      			}
      		i=0;
      			
      		}
      	fclose(fichier_Hex);
      	fclose(fichier_Bin);
      	}
      
      /**
      * Pré:
      * @param fichierBin contier l'adresse d'un fichier binaire remplie
      * @param fichierTxt contient un ficher texte vide où remplie (mais sera écraser);
      * Post:
      * @param fichierBin est inchangé
      * @param fichierTxt contiendra du texte
      **/
      void BinToTexte(char * fichierBin, char * fichierTxt){
      	
      	FILE * fichier_Bin;
      		//on ouvre le fichier binaire pour lire le contenu
      		if ((fichier_Bin = fopen(fichierBin,"rb"))==NULL) {
              perror("Read "); 
              exit(1);
      		}
      	
      	FILE * fichier_Txt;
      		
      		//on ouvre le fichierTexte pour y écrire
      		if ((fichier_Txt = fopen(fichierTxt,"w"))==NULL) {
              perror("Write "); 
              exit(1);
      		}	
      	
      	int lettre;
      	
      		while (fread(&lettre,sizeof(int),1,fichier_Bin)){
      		fread(&lettre, 1 * sizeof(int), 1, fichier_Txt);
      		}
      		
      	fclose(fichier_Txt);
      	fclose(fichier_Bin);
      	}
      	
      	
      int main (void){
      
      	printf("Travail n°4, en C\n");
      	
      	/* conversion faux hexadecimal en binaire */
      	HexaToBin(fichierBinaire,fichierTexteHexa);
      	/* Conversion binaire en texte lisible */
      	BinToTexte(fichierBinaire,fichierTexte);
      	
      return 0;
      }
      
      
      0
    2. Contributeur
      Pourquoi faire appel à des headers non standards ? Sachant que tu ne les utilises pas (genre : #include <sys/wait.h>, mais c'est pas la seule).
      Ensuite, mets plutôt exit(EXIT_FAILURE) que exit(1);
      Attention, dans les if : if(i=1) => if(i==1) vérifie s'il n'y a pas d'autres erreurs de ce style.
      0
    3. pour les bibli on ne les à pas étudier je sais l'utilité de quelque une d'entre elle mais pas de tous. J'ai supprimer celle que tu ma dis mais pour les autres je ne sais pas.
      j'ai aussi modifier les exit(1); mais pourquoi faut il plutot utiliser EXIT_FAILURE ?
      Sinon pas moyen de trouver le if qui contient une erreur.
      0
    4. J'ai trouver le if en question (je regardais la mauvaise sauvegarde :( )
      Sa à l'air de marcher mais je boucle a la lecture je lis -1 en boucle dans le fichier.. Donc je n'atteint jamais la fin
      0
    5. Contributeur
      J'ai supprimer celle que tu ma dis mais pour les autres je ne sais pas.
      Tu peux supprimer également :
      #include <unistd.h>
      #include <sys/types.h>
      #include <fcntl.h>

      mais pourquoi faut il plutot utiliser EXIT_FAILURE ?
      EXIT_FAILURE correspond à la valeur attendue pour indiquer que cela s'est mal déroulé. Dans certains cas (la plupart), cela vaut 1, mais pas systématiquement.

      Pour le reste, je sens que tu vas devoir reposter ton code avec les modifications que tu as faites et sur la bonne version.

      Courage, tu es sur la bonne voie ;-).
      0