Est ce possilble de mettre la ligne suivante dans company.address avec un fscanf?Code:
1
2
3
4 struct record { char name[30]; char address[30]; }company;
(cette ligne se trouve dans un fichier)Citation:
7595 Technology Way
Version imprimable
Est ce possilble de mettre la ligne suivante dans company.address avec un fscanf?Code:
1
2
3
4 struct record { char name[30]; char address[30]; }company;
(cette ligne se trouve dans un fichier)Citation:
7595 Technology Way
Oui c'est possible.
On n’a jamais lu des structures avec la fonction fscanf je ne sais pas si c’est possible mais pour moi je travaille sur le turbo c++
Tu peut lire toute la ligne avec toutes les espaces soi par
1 -2-Code:
1
2
3
4
5
6 int i=0 ; Do{ Ch=fgetc(f) ; Sf[i]=ch ; i++ ; }while(ch !=EOF);
Ou bien avec la fonction fgets
Par exemple :
Code:Fgets(sp,100,f) ;
Code:fscanf(sf, "%29[^\n]", company.address);
salut
tu peux utiliser
Code:fputs(company.address,f);//avec f pointeur vers le fichier
toujours rien :(
voici mon code
fichier d'entreeCode:
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 #include <stdlib.h> #include <stdio.h> typedef struct { char name[30]; char address[30]; } record ; record readfile (FILE *, record company); int main (int argc, char *argv []) { record company; FILE *fp; char fname[30]; if ( argc != 2 ) { fprintf ( stdout, "please specify a filename : "); gets(fname); } else if (argc > 2 ) fprintf ( stdout, "Usage : newcom [filename]\n"); if ( ( fp = fopen ( fname, "r" ) ) == NULL ) { fprintf (stderr, "Unable to open specified file %s!\n", fname ); exit ( 1 ); } readfile(fp, company); fclose(fp); } record readfile (FILE *sf, record company) { fscanf(sf, "%s", company.name); fscanf(sf, "%29[^\n]", company.address); fprintf(stdout, "%s\n", company.name); /* ca marche pour cette ligne */ fprintf(stdout, "%s", company.address); /* celle-la non */ fputs(company.address. sf); /* pareil */ return(company); }
Citation:
Microsoft
7595 Technology Way
Et avec un fgets ?
Si tu veux que la fonction readfile puisse modifier la structure company que tu lui donnes en argument, il faut lui donner un pointeur vers cette structure. L'appelle se fait donc par :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #define NBCHARPARLIGNE 100 void readfile(FILE *sf, record *company) { char *ligne=NULL; ligne=malloc(sizeof(char)*NBCHARPARLIGNE); if ( ligne==NULL ) { erreur... } if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) { strcpy(*company.name,ligne); fprintf(stdout,"%s\n",*company.name); } if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) { strcpy(*company.address,ligne); fprintf(stdout, "%s\n",*company.address); } free(ligne); }
Code:
1
2 readfile(sf,&company);
Je prend :mrgreen:
Merci pour la reponse.
Il y avait un probleme de compilation
Enlever les asterisk devant les fields de structures a regle le probleme.Citation:
tree.c: In function `readfile':
tree.c:49: warning: passing arg 1 of `strcpy' makes pointer from integer without a cast
tree.c:53: warning: passing arg 1 of `strcpy' makes pointer from integer without a cast
Est ce qu'il ny aurait pas une alternative plus simple.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 record readfile (FILE *sf, record company) { char *ligne = NULL; ligne = malloc(sizeof(char)*NBCHARPARLIGNE); if ( ligne == NULL ) { fprintf(stderr, "error\n"); } if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) { strcpy(company.name, ligne); fprintf(stdout,"%s\n",company.name); } if ( fgets(ligne,NBCHARPARLIGNE,sf) != NULL) { strcpy(company.address,ligne); fprintf(stdout, "%s\n",company.address); } free(ligne); return(company); }
renvoi toujours 1 donc soit tu écris directementCode:sizeof(char)
soit et c'est ce que je conseille, tu utilise la forme canonique (merci à Emmanuel Delahaye) :Code:ligne=malloc(NBCHARPARLIGNE);
qui a un énorme avantage c'est que si un jour tu te mets à l'unicode tu n'as qu'un seul changement à faire :Code:ligne=malloc(NBCHARPARLIGNE * sizeof *ligne);
avec l'entête qui va bien.Code:wchar_t *ligne=NULL;
Cordialement.
D'après mes essais (correction du code de virtuadrack), ça ne fonctionne pas...
Code:
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 #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct { char name[30]; char address[30]; } record; /* -ed- record readfile (FILE * sf, record company) Horrible ! Meme si c'est techniquement possible, on ne passe pas une structure en entier. On ne passe que son adresse... ; void readfile (FILE * sf, record *p_company) ou si on gere un code retour... */ int readfile (FILE * sf, record * p_company) { int err = 0; int n; n = fscanf (sf, "%s", p_company->name); err = n != 1; if (!err) { fprintf (stdout, "%s\n", p_company->name); /* ca marche pour cette ligne */ n = fscanf (sf, "%29[^\n]", p_company->address); printf ("n=%d\n", n); fprintf (stdout, "%s", p_company->address); /* celle-la non */ /* -ed- fputs (company.address.sf); ceci n'a aucun sens. Tu voulais peut etre dire fputs (company.address,sf); mais ce n'est pas mieux, car sf est un fichier ouvert en lecture... Ce que tu veux est : */ fputs (p_company->address, stdout); } else { perror (""); } /* -ed- parentheses inutiles... return (company); */ return err; } int main (int argc, char *argv[]) { /* -ed- revision de l'algorithme... */ char fname[30]; if (argc != 2) { fprintf (stdout, "please specify a filename : "); /* -ed- fonction interdite ! utiliser fgets() et nettoyer correctement.*/ gets (fname); } else { /* -ed- Eek ! fname n'est jamais initialise... */ /* if ((fp = fopen (fname, "r")) == NULL) */ strcpy (fname, argv[1]); } { FILE *fp = fopen (fname, "r"); if (fp != NULL) { record company; readfile (fp, &company); fclose (fp); } else { perror (fname); } } return 0; }
Code:
1
2
3
4
5 Microsoft n=0 ╬├┐w↑ " ╬├┐w↑ " Press ENTER to continue.
C'est normal, tu ne sautes pas le caractères '\n' alors tu bloque dessus.
Code:
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 #include <stdio.h> typedef struct { char name[30]; char address[30]; } record; int readfile (FILE * sf, record * p_company); int create_file(char const *filename); int main (void) { char const *fname = "fichier.tmp"; if (create_file (fname) == 0) { FILE *fp = fopen (fname, "r"); if (fp != NULL) { record company = { 0 }; readfile (fp, &company); fclose (fp); } else { perror (fname); } remove(fname); } return 0; } int readfile (FILE * sf, record * p_company) { int err = 0; if (fscanf (sf, "%29s", p_company->name) !=1) { err = 1; } else { puts (p_company->name); fgetc (sf); if (fscanf (sf, "%29[^\n]", p_company->address) != 1) { err = 2; } else { puts (p_company->address); } } return err; } int create_file(char const *filename) { int err = 0; FILE *fichier = fopen(filename,"w"); if(fichier == NULL) { perror(__func__); err = 1; } else { fputs("nom_au_hasard\n",fichier); fputs("7595 Technology Way\n",fichier); fclose(fichier); } return err; }
Merci pour vos reponses.
J'ai pris en compte beaucoup de vos corrections.
Je veux apprendre a faire des arbres binaires, et je voudrais savoir si c'est possible d'integrer les informations lues dans la fonction readfile dans un arbre binaire pour y effectuer des recherches sur les compagnies. Chaque recherche sur le nom de la compagnie devra afficher toutes ses informations (addresse, email, phone...)Code:
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 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> #define NBCHARPARLIGNE 100 typedef struct { char name[30]; char address[30]; char city[30]; char state[4]; double zip[15]; char phone[13]; char email[30]; }record; int readfile (FILE * sf, record * company); int main (int argc, char *argv[]) { char fname[30]; FILE *sf; if (argc != 2) { fprintf (stdout, "please specify a filename : "); gets (fname); } else { if ((sf = fopen (fname, "r")) == NULL) strcpy (fname, argv[1]); } { FILE *sf = fopen (fname, "r"); if (sf != NULL) { record company; readfile (sf, &company); fclose (sf); } else { perror (fname); } } return 0; } int readfile (FILE *sf, record *company) { char *ligne = NULL; ligne = malloc(NBCHARPARLIGNE * sizeof * ligne); if ( ligne == NULL ) { fprintf(stderr, "error\n"); } if ( fgets(ligne,NBCHARPARLIGNE, sf) != NULL) { strcpy(company->name, ligne); fprintf(stdout,"\n%s", company->name); } if ( fgets(ligne,NBCHARPARLIGNE, sf) != NULL) { strcpy(company->address, ligne); fprintf(stdout, "%s",company->address); } free(ligne); return 0; }
Est ce que la "key" de l'arbre binaire doit etre juste le nom de la compagnie, ou doit-il y a voir plusieurs keys pour chaque information ? Si oui, dois-je mettre une deuxieme structure de cette maniere
Ou bien utiliser ma structure principal et essayer dy inclure la cle, et les noeuds gauche et droit ?Code:
1
2
3
4 typedef struct _noeud { char *companyname; noeud *gauche, *right; } noeud;
Merci
PS: Tout autre critique de mon code est la bienvenue
Code:
1
2
3 test2.c:35: attention : declaration of «sf" shadows a previous local test2.c:23: attention : déclaration est masquée ici test2.c:26: warning: the `gets' function is dangerous and should not be used.
Me signale aucun warning ni aucune erreur. :roll:Code:gcc tree.c -Wall -o tree
Alors il faut apprendre à le régler correctement :
http://emmanuel-delahaye.developpez....fg_compilo_gcc
Cordialement.