Malloc / Lecture fichier

Malloc / Lecture fichier - C - Programmation

Marsh Posté le 23-07-2008 à 11:15:53    

Bonjour,
j'ai un nouveau probleme de lecture de fichier [:alph-one]  
 
J'ai ecrit une fonction qui me permet de lire plusieurs caracteres dans un fichier jusqu'au caractere choisi (si je veux lire une ligne, je met '\n' comme parametre)
 

Code :
  1. //Fonction qui permet la lecture d'une ligne jusqu'au caractere choisi
  2. char* lecture(FILE*fp,char caractere)
  3. {
  4.       char temp[100];
  5.       char *ligne;
  6.       int i=0;
  7.       int j=0;
  8.       char c='a';
  9.      
  10.       //initialisation du tableau
  11.       for(j=0;j<100;j++) temp[j]='\0';
  12.      
  13.       while(c!=caractere && c!=EOF)
  14.      {
  15.                  
  16.             c=fgetc(fp);
  17.             temp[i]=c;
  18.             i++;
  19.      }
  20.    
  21.      ligne = (char*) malloc (sizeof(char)*(i));
  22.      strncpy (ligne,temp,i);
  23.       return ligne; 
  24. }


 
Simplement, je dois faire quelquechose de mal etant donné que si je lis "texte.txt", la fonction deconne et renvoi "texte.txtsWindows".
je comprend pas d'ou vient l'erreur. Quand j'affiche la valeur de i est 10, la taille de temp est 10 et la taille de ligne est 17. :s pourtant je fais bien mon malloc (il me semble)
Merci de votre aide


Message édité par fatloui le 23-07-2008 à 13:54:46
Reply

Marsh Posté le 23-07-2008 à 11:15:53   

Reply

Marsh Posté le 23-07-2008 à 13:55:05    

petit up

Reply

Marsh Posté le 23-07-2008 à 14:04:13    

Il faut toujours mettre un caractère nul en fin d'une chaine en C. Donc, ajouter ligne 19 :

temp[i] = '\0';

Reply

Marsh Posté le 23-07-2008 à 14:12:05    

merci pour ta reponse
 
ben en fait temp est initialisé à '\0' et le fait que j'increment encore une fois i sous entend que je copie tout les caracteres de temp+un '\0'.
 
j'ai donc toujours la meme erreur...

Reply

Marsh Posté le 23-07-2008 à 14:22:15    

Code :
  1. char* lecture(FILE*fp,char caractere)


Le type naturel pour les caractères, en C, c'est int :
char * lecture (FILE *fp, int caractere)

 

(regarde par exemple le type de retour des fonctions fget...() )

 
Code :
  1. char c='a';


Cf. juste au dessus :
int c = 'a';

 
Code :
  1. //initialisation du tableau
  2.       for(j=0;j<100;j++) temp[j]='\0';


Tu peux écrire, à la place :
memset(temp, '\0', 100);
     

 
Code :
  1. ligne = (char*) malloc (sizeof(char)*(i));


Sauf que "i" contient le nombre de caractères saisis : 1 pour 1 caractère, 2 pour 2 caractères, ..., n pour n caractères.
Or, comme le fait remarquer olivthill, il faut toujours qu'une chaîne se termine par '\0'.
Donc, il faut allouer (i+1) caractères pour ligne, et terminer cette variable par '\0'

 

De plus, il est tout à fait inutile de caster le type de retour de malloc(), et sizeof(char) vaut toujours 1 par définition :
ligne = malloc(i+1);

 

Ou, si tu veux être absolument propre : ligne = malloc(sizeof(char) * (i+1));

 
Code :
  1. strncpy (ligne,temp,i);


strncpy() est une fonction dangereuse si tu ne sais pas exactement ce qu'elle fait.
En l'occurence, si la taille de temp est supérieure ou égale à i, ce qui est le cas, alors... aucune '\0' n'est copié dans ligne.
Ton erreur est donc ici.

 

Comme tu connais exactement la taille de temp et de ligne, utilise tout simplement :
strcpy(ligne, temp);

Message cité 1 fois
Message édité par Elmoricq le 23-07-2008 à 14:23:43
Reply

Marsh Posté le 23-07-2008 à 15:03:55    

Elmoricq a écrit :

Code :
  1. char* lecture(FILE*fp,char caractere)


Le type naturel pour les caractères, en C, c'est int :
char * lecture (FILE *fp, int caractere)
 
(regarde par exemple le type de retour des fonctions fget...() )
 

Code :
  1. char c='a';


Cf. juste au dessus :
int c = 'a';
 


c'est seulement pour les puristes non ? :p
j'ai quand meme testé changé le type[:arn0]  

Elmoricq a écrit :


Code :
  1. //initialisation du tableau
  2.       for(j=0;j<100;j++) temp[j]='\0';


Tu peux écrire, à la place :
memset(temp, '\0', 100);
 


Merci je connaissais pas cette fonction
     

Elmoricq a écrit :


Code :
  1. ligne = (char*) malloc (sizeof(char)*(i));


Sauf que "i" contient le nombre de caractères saisis : 1 pour 1 caractère, 2 pour 2 caractères, ..., n pour n caractères.
Or, comme le fait remarquer olivthill, il faut toujours qu'une chaîne se termine par '\0'.
Donc, il faut allouer (i+1) caractères pour ligne, et terminer cette variable par '\0'
 
De plus, il est tout à fait inutile de caster le type de retour de malloc(), et sizeof(char) vaut toujours 1 par définition :
ligne = malloc(i+1);
 
Ou, si tu veux être absolument propre : ligne = malloc(sizeof(char) * (i+1));  


je savais qu'il fallait ajouter un caractere mais vu que la boucle incrementait une fois le i à la fin, je pensais que j'avais deja mon n+1 nombre de caractere. non?

Elmoricq a écrit :


Code :
  1. strncpy (ligne,temp,i);


strncpy() est une fonction dangereuse si tu ne sais pas exactement ce qu'elle fait.
En l'occurence, si la taille de temp est supérieure ou égale à i, ce qui est le cas, alors... aucune '\0' n'est copié dans ligne.
Ton erreur est donc ici.
 
Comme tu connais exactement la taille de temp et de ligne, utilise tout simplement :
strcpy(ligne, temp);


effectivement je n'avais pas pensé au '\0' Mon erreur etait bien la Merci ^^

Reply

Marsh Posté le 23-07-2008 à 15:05:05    

fatloui a écrit :


je savais qu'il fallait ajouter un caractere mais vu que la boucle incrementait une fois le i à la fin, je pensais que j'avais deja mon n+1 nombre de caractere. non?


 
Sauf que i vaut 0 au départ.

Reply

Sujets relatifs:

Leave a Replay

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