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
La ligne en question est par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char line[10000]; fgets(line,sizeof line,file);
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
Ce que je désire faire est tout simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TEMP 350 400 450 ! commentaires de l'utilisateur
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); } }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
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'; }
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
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));
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 21
Je ne comprends donc pas bien : ma ligne line, est-elle
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
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\n
ou bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 line = TEMP 350 400 450.613\0
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 line = TEMP 350 400 450.613
Merci.
Partager