Bonjour tout le monde,
est ce qu'il ya un moyen pour savoir la fin d'une ligne dans un fichier texte utilisant le langage C (des fonctions par exemple)
Bonjour tout le monde,
est ce qu'il ya un moyen pour savoir la fin d'une ligne dans un fichier texte utilisant le langage C (des fonctions par exemple)
Tu sais qu'une ligne est finie quand il y a un \n dans les données récupérées.
mais le probleme c'est que je lis mot par mot.
Salut,
Mais pour lire mot par mot, tu effectues bien un traitement caractère par caractère, non ?
Montre nous ton code, ça sera plus facile
voila le code j'esai de lire un mot puis un caractere par ce que je veut copier le moiter dans un fichier et puis le reste dans un autre.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 void parc_fich(char nam_rep[20],char n_module[20],FILE *ff) { FILE *inn,*temp; char c; char str1[10000]; inn=NULL; //find_file_of_module retourne le fichier que je veut lire inn=fopen(find_file_of_module(nam_rep,n_module),"r"); if(inn){ while(!feof(inn)){ fscanf(inn,"%s",str1); fscanf(inn,"%c",&c); fprintf(ff,"%s",str1); fprintf(ff,"%c",c); if(!strcmp(str1,"module")) { fscanf(inn,"%s",str1); fscanf(inn,"%c",&c); fprintf(ff,"%s",str1); fprintf(ff,"%c",c); if(!strcmp(n_module,str1)) { while(strcmp("endmodule",str1)){ fscanf(inn,"%s",str1); fscanf(inn,"%c",&c); if(!strcmp("endmodule",str1)) {temp=fopen("temp","w"); while(!feof(inn)){ fscanf(inn,"%c",&c);fprintf(temp,"%c",c); } break;} fprintf(ff,"%s",str1); fprintf(ff,"%c",c); } break; } } } } else printf("fichier %s n'existe pas",find_file_of_module(nam_rep,n_module)); fclose(inn); }
Quelques remarques sur le code :
- Ceci ne permet pas de détecter la fin d'un fichier :
Les formes canoniques sont :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while(!feof(fp)) { /* instructions */ }et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while((c = fgetc(fp)) != EOF) { /* instructions */ }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while(fgets(s, sizeof s, fp) != NULL) { /* instructions */ }- Ce n'est pas une bonne idée d'utiliser fscanf() : comportement indéterminé si le fichier n'est pas correctement formaté, pas de contrôle de la taille de la chaine saisie.
- Je ne comprends pas la logique du code : pourquoi ces instructions break ?
- Le code n'est pas complet, on ne peut pas le compiler pour le tester
- Comment est justifiée la taille donnée à str1 ?
voila le code complet et ca marche .
mais le probleme quand je l'insere dans un autre application me donne l'erreur suivat:
#0 0x400a5d5f in _IO_vfprintf (s=0x0, format=0x808b118 "%s", ap=0xbfffe868) at vfprintf.c:270
270 vfprintf.c: No such file or directory.
in vfprintf.c
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> /*pour savoir l'extention du fichier s'il est ".v"*/ int file_verilog(str) char *str; { if((str[strlen(str)-2]=='.')&&(str[strlen(str)-1]=='v')) return 1; else return 0; } /*****************************************************************************************************\ cette fonction retourne le nom du fichier ou se trouve le module "name_module" dans le repertoire repp \***********************************************************************************/ char *find_file_of_module( char repp[80],char str2[80]) // { FILE *in1; char str1[1000000],path_file[80]; int uu=0; DIR *rep = opendir (repp); if (rep != NULL) { struct dirent *lecture; struct stat st; while ((lecture = readdir (rep))) { stat (lecture->d_name, &st); if(file_verilog(lecture->d_name)) { sprintf(path_file,"%s/%s",repp,lecture->d_name); in1=fopen(path_file, "r"); while(!feof(in1)){ fscanf(in1,"%s",str1); if((!strcmp(str1, "module"))) { fscanf(in1,"%s",str1); if((!strcmp(str1,str2))) {uu=1;break;} } } fclose(in1); if(uu==1) return path_file;/*lecture->d_name;*/ } } closedir (rep); rep = NULL; return "MOD"; } else printf("le repertoire n'existe pas\n"); } /***************************************************************************\ cette methode parcours le fichier ou se trouve le module, et se place a la fin du module "n_module" sans l'ecriture du endmodule \*********************/ void parc_fich(char nam_rep[20],char n_module[20],FILE *ff) { FILE *inn,*temp; char c; char str1[10000]; inn=NULL; inn=fopen(find_file_of_module(nam_rep,n_module),"r"); if(inn){ while(!feof(inn)){ fscanf(inn,"%s",str1); fscanf(inn,"%c",&c); fprintf(ff,"%s",str1); fprintf(ff,"%c",c); if(!strcmp(str1,"module")) { fscanf(inn,"%s",str1); fscanf(inn,"%c",&c); fprintf(ff,"%s",str1); fprintf(ff,"%c",c); if(!strcmp(n_module,str1)) { while(strcmp("endmodule",str1)){ fscanf(inn,"%s",str1); fscanf(inn,"%c",&c); if(!strcmp("endmodule",str1)) {temp=fopen("temp","w"); while(!feof(inn)){ fscanf(inn,"%c",&c);fprintf(temp,"%c",c); } break;} fprintf(ff,"%s",str1); fprintf(ff,"%c",c); } break; } } } } else printf("fichier %s n'existe pas",find_file_of_module(nam_rep,n_module)); fclose(inn); } int main() { printf("\n\n\n\n\n\n"); parc_fich("rep_ou_se_trouve_le_ficier","mot_dans_un_fichier",stdout); printf("\n\n\n"); return 0; }
Voici ce que donne la compilation :voila le code complet et ca marche .
De plus, j'ai lancé le programme et il a planté.
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 Project : test_2 Compiler : GNU GCC Compiler (called directly) Directory : G:\Documents\benoit\prog\test_2\ -------------------------------------------------------------------------------- Switching to target: default Compiling: main.c main.c:7: warning: function declaration isn't a prototype main.c: In function `file_verilog': main.c:9: warning: implicit declaration of function `strlen' main.c: In function `find_file_of_module': main.c:35: warning: implicit declaration of function `strcmp' main.c:42: warning: function returns address of local variable main.c:48: warning: return discards qualifiers from pointer target type main.c: At top level: main.c:103: warning: function declaration isn't a prototype main.c: In function `main': main.c:106: warning: passing arg 1 of `parc_fich' discards qualifiers from pointer target type main.c:106: warning: passing arg 2 of `parc_fich' discards qualifiers from pointer target type main.c:110:3: warning: no newline at end of file main.c: In function `find_file_of_module': main.c:51: warning: control reaches end of non-void function Linking console executable: G:\Documents\benoit\prog\test_2\test_2.exe Process terminated with status 0 (0 minutes, 0 seconds) 0 errors, 10 warnings
Il faut commencer par corriger le code en suivant les remarques énoncées dans le post précédant.
la version de gcc que j'utilise est :
je pense que c'est un probleme de la version?gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)
Je ne pense pas que ça vienne du compilateur.
Pense tout de même à le configurer comme ceci : http://emmanuel-delahaye.developpez....tm#cfg_compilo
Mais as-tu testé ton programme sans la présence du fichier à ouvrir ? (Essaie de renommer le fichier à ouvrir, puis lance le programme).
Mais j'insiste sur le fait que ce code contient des erreurs de programmation et que même s'il peut avoir l'air de fonctionner il faut le corriger.
Si un mot est terminé par un \n, c'est une fin de ligneEnvoyé par radouane_as
Mais ce serait plus simple de lire ligne par ligne avec fgets(), c'est fait pour. Ensuite, on extrait les mots...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if (strchr(mot, '\n') != NULL) {
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager