Bonjour, je me mêle les pinceaux entre les caractères \0 et \n.

Voilà mon pb : je lis une ligne dans un fichier txt à l'aide de fgets
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
char line[10000];
fgets(line,sizeof line,file);
La ligne en question est par exemple

ou bien, dans le cas où l'utilisateur mais un commentaire

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
TEMP 350 400 450  ! commentaires de l'utilisateur
Ce que je désire faire est tout simple :
1) supprimer le caractère fin de ligne \n (car mon fichier txt contient plusieurs lignes) --> cf la fonction DeleteCharEndOfLigne
2) supprimer le commentaire --> cf la fonction DeleteComment
3) rentrer les 3 valeurs dans un tableau --> je sais faire cette étape

J'ai un pb pour les étapes 1 et 2. Voici mes deux fonctions annexes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
void DeleteCharEndOfLine(char * line_,unsigned short nl,unsigned short nl_)
{
  /*
    Delete char '\n' if this one was founded in the string line_,
    send an error message otherwise
    nl is the number of line of the input file
    nl_ is the number of the line which contains the string line_
  */
 
  char * p = strchr(line_,'\n'); /* char '\n' is sought */
  if (p != NULL) /* if it was founded it is cleared */
    *p =0;
  else if(nl_!=nl) /* the last line of input file can not to have char '\n' */
  {
    /* tabular is too short. Exit program */
    fprintf(stderr,"Error in file %s line %d in function %s : tabular line_ is too short\nIncrease its size\nExit program\n",__FILE__,__LINE__,__FUNCTION__);
    exit(1);
  }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
void DeleteComment(char * line_)
{
  /* This function deletes the char '!' and all the char after it of
     the string line_.
     This function deletes also all the spaces befor the char '!' and
     the last char of line_ which isn't a space
  */
  char * p=strchr(line_,'!');
  if(p!=NULL)
  {
    /* d is the index of string line_ which contains the char '!' 
       Remark : the first index is 0
    */
    int d=p-line_,i; 
    for(i=d-1;line_[i]==' ';--d,--i);
    char dest[d];
    char * s3=strncpy(dest,line_,d);
 
     /* we add char '\0' at the end of s3 so at the end of line_ */
    s3[d]='\0';    
    char * aux=strcpy(line_,s3);
    assert(aux!=NULL);
  }
  /* we add char '\0' at the end of line_. The last index is
     strlen(line_)-1
  */
  //else line_[strlen(line_)-1]='\0';
}
Voici mon prgm

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
printf("line = %s\n",line);
 
if(strchr(line,'\0')!=NULL) printf("oui\n"); else printf("non\n");
if(strchr(line,'\n')!=NULL) printf("oui\n"); else printf("non\n");
printf("%d\n",strlen(line));
 
DeleteCharEndOfLine(line,countline,countline2);
 
if(strchr(line,'\0')!=NULL) printf("oui\n"); else printf("non\n");
if(strchr(line,'\n')!=NULL) printf("oui\n"); else printf("non\n");
printf("%d\n",strlen(line));
 
DeleteComment(line);
 
if(strchr(line,'\0')!=NULL) printf("oui\n"); else printf("non\n");
if(strchr(line,'\n')!=NULL) printf("oui\n"); else printf("non\n");
printf("%d\n",strlen(line));
Les sorties sont :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
line = TEMP 350 400 450.613
 
oui
oui
22
oui
non
21
oui
non
21
En revanche, si dans la fonction DeleteComment, je supprime le commentaire devant le else, j'obtiens comme sorties :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
line = TEMP 350 400 450.613
 
oui
oui
22
oui
non
21
oui
non
20
Je ne comprends donc pas bien : ma ligne line, est-elle

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
line = TEMP 350 400 450.613\0\n
j'ai mis explicitement les caracètres \0 et \n ou seulement \n mais après, est-ce qu'elle devient

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
line = TEMP 350 400 450.613\0
ou bien

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
line = TEMP 350 400 450.613
Savez-vous où se trouvent les coquilles dans ces deux fonctions ? Normalement je dois toujours avoir le caractère \0 à la fin de ma string non ?

Merci.