Un peu de recherche avant de poster sur le forum ne te ferais pas de mal
Citation:
Envoyé par
l1informatique
Bonjour,
J'essaye de répondre a cette question :Ecrivez un programme qui lit une suite d'adresses dans un fichier et les met dans une table de structures.
Code:
1 2 3 4
| mon fichier contient deux lignes d'adresses suivantes:
6 rue flobet 352100
5 rue guy de ronoit 65200 |
j'ai essayé de réaliser ce code mais il m'envoit erreur de segmentation
Code:
Erreur de segmentation (core dumped)
pourriez vous m'aider je bloque sur ça depuis des jours je ne trouves pas ou est le problème .
Merci
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
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct adresse adresse1;
struct adresse {
int numero;
int postale;
char *voie;
char *nomdelavoie;
char *ville;
};
int main(void) {
int n = 0, i;
struct adresse *adresse1;
FILE *f = fopen("adresses.txt","r");
if (!f) {
printf("Impossible d'ouvrir le fichier\n");
return 1;
}
char ligne[256];
while (fgets(ligne,256,f)) {
if (n == 0) {
adresse1 = malloc(sizeof(struct adresse)*(n+1));
}
else {
adresse1 = realloc(adresse1,sizeof(struct adresse)*(n+1));
}
fscanf(f, "%d",&adresse1[n].numero);
fscanf(f, "%s",adresse1[n].voie);
fgets(adresse1[n].nomdelavoie , sizeof(adresse1[n].nomdelavoie), f);
fscanf(f, "%s", adresse1[n].ville);
fscanf(f, "%d",&adresse1[n].postale);
n++;
}
for (i = 0; i < n; i++)
{
printf("Numero : %d\n", adresse1[i].numero);
printf("voie : %s\n", adresse1[i].voie);
printf("Nom de la voie :%s\n", adresse1[i].nomdelavoie);
printf("ville :%s\n", adresse1[i].ville);
printf("postale : %d\n", adresse1[i].postale);
fclose(f);
free(adresse1);
}
return 0;
} |
1) T'aurais du commencer par chercher sur developpez il y-a d'excellent cours sur les pointeurs ou sur le C lui même (je code pour le plaisir, je suis autodidacte et avant d'aborder un nouveau langage de programmation je me documente, oui monsieur, J'apprends au minimum les bases (pas de bibliothèque, pas de fonction nécessitant l'inclusion de bibliothèque))
2) Le langage C ne fera que ce que tu lui demande, il ne lie pas dans les pensés des gens, alors ne t'attends pas a des miracles, on t'as dit en haut que t'as erreur core dump parce que....
C'est simple à chaque fois que tu ton fameux:
Code:
adresse1 = malloc(sizeof(struct adresse)*(n+1))
ou
Code:
adresse1 = alloc(sizeof(struct adresse)*(n+1))
Tu alloues de la mémoire que pour des structures de type adresse, or ta fameuse structure est composé de deux int et de trois pointeurs sur des char, (trois pointeurs et non trois chaînes de caractère), quand tu fait:
Code:
1 2 3
| fgets(adresse1[n].nomdelavoie , sizeof(adresse1[n].nomdelavoie), f);
fscanf(f, "%s", adresse1[n].ville);
fscanf(f, "%s",adresse1[n].voie); |
tu envoies les char lu du fichier vers des espaces mémoire sensé contenir que des char pointaient respectivement par adresse1[n].ville, ...[n].voie, et ...nomdelavoie, et tes pointeurs ils pointent sur quoi? On ne s'est pas puisque tu n'as pas allouer de la mémoire, bref t'aurais du faire un petit:
Code:
1 2 3 4
|
adresse1[n].nomdelavoie = malloc( 256*sizeof( char));/* généralement sizeof(char) == 1*/
adresse1[n].ville = malloc( 256*sizeof( char));
adresse1[n].voie = malloc( 256*sizeof( char)); |
avant de tes scanf, en supposant que le nombre de caractère lu pour nomdelavoie, ville et voie ne dépasse pas 256 caractères (à chaque lecture).
Voilà c'étais pas aussi compliquer mais t'aurais du commencer par chercher.
Tant qu'on y est quand on fait un
Code:
scanf( File *, "%s", char *)
la fonction rajoute un '\0' dans la chaîne de caractère ou est ce qu'on doit le faire explicitement? Et aussi est ce que c'est le cas dans toutes peut importe le compilateur, etc...?