[Split] [Erreur de segmentation] [C] [Programmation]
Résolu
Aragorn
-
Aragorn19 Messages postés 6 Statut Membre -
Aragorn19 Messages postés 6 Statut Membre -
Bonjour,
Je fais un programme qui me récupère des données d'un fichier .csv, et je split chaque ligne pour mettre ces données dans une structure de données. Quand j’exécute le programme ça fonctionne jusqu'à une certaines lignes de mon csv, et ça affiche : "Erreur de segmentation (core dumped)".
Quelqu'un aurait-il une idée ?
merci.
Je fais un programme qui me récupère des données d'un fichier .csv, et je split chaque ligne pour mettre ces données dans une structure de données. Quand j’exécute le programme ça fonctionne jusqu'à une certaines lignes de mon csv, et ça affiche : "Erreur de segmentation (core dumped)".
Quelqu'un aurait-il une idée ?
merci.
A voir également:
- [Split] [Erreur de segmentation] [C] [Programmation]
- Split cam - Télécharger - Messagerie
- Application de programmation - Guide
- Erreur 0x80070643 - Accueil - Windows
- Erreur de lecture reconnecté en 3s - Forum TV & Vidéo
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
Merci quand même.
Une erreur ne se manifeste pas forcément tout de suite. Il peut se produire dans certains cas et pas dans d'autres.
Pire, un code peut même contenir une erreur et ne jamais planter.
Bref, sans ton code, on ne peut pas t'aider.
Du coup, cela ne facilite pas la lecture.
struct voyageur {
[...]
souhait ...;
}
Attention, souhait n'est pas encore défini à ce moment. Soit il faut mettre struct souhait, soit mettre le typedef avant la structure voyageur.
struct liste_base {
[...]
personne pers;
}
Attention, personne n'est pas encore définit à ce moment. Il faut mettre le typedef avant la structure liste_base.
p.nom = *(token + i);
printf("[%s]\n", p.nom);
Vu que tu ne te sers pas de p.nom et cie, pourquoi passer par la variable p.nom ? Tu peux directement afficher la variable *(token+i). A noter que tu peux même utiliser token[i].
int main()
Le bon prototype est : int main(void)
Et enfin, le gros problème :
for(j=1; j<7; j++)
{
p.choix1.planete[j] = *(token + i);
i++;
plante est définie comme un tableau de 6 pointeurs sur char. Le 1er élément est : planete[0] et le dernier est planete[5]. Tu ne peux pas utiliser planete[6], sinon plantage.
Pour la prochaine fois. Merci d'utiliser plutôt la balise <code c> et non <code>. Ca sera encore plus lisible (couleur et tout :-)).
Exemple :
<code c>ici tu mets ton code</code>
Et vérifie bien qu'il n'y a pas de problème particulier concernant l'affichage. Si c'est le cas, tu as la possibilité de modifier ton commentaire. Ca sera plus lisible pour nous, et t'obtiendras une réponse plus rapidement.
Cdlt,
D'accord, je fais ça maintenant dans le doute :
struct souhait_base{ char* planete[6]; }; typedef struct souhait_base souhait; struct voyageur { int mark; char* nom; char* prenom; char* choix_1; char* choix_2; souhait choix1; souhait choix2; souhait choix3; souhait choix4; int priorite; }; typedef struct voyageur personne; struct liste_base { personne pers; liste* next; }; typedef struct liste_base* liste; char** str_split(char* a_str, const char a_delim) { char** result = 0; size_t count = 0; char* tmp = a_str; char* last_comma = 0; char delim[2]; delim[0] = a_delim; delim[1] = 0; /* Count le nombre d'élément à extraire */ while (*tmp) { if (a_delim == *tmp) { count++; last_comma = tmp; } tmp++; } /* Ajouter un espace pour les tokens. */ count += last_comma < (a_str + strlen(a_str) - 1); /* Ajouter un espace pour le NULL de la fin pour savoir où se termine les résultats*/ count++; result = malloc(sizeof(char*) * count); if (result){ size_t idx = 0; char* token = strtok(a_str, delim); while (token) { assert(idx < count); *(result + idx++) = strdup(token); token = strtok(0, delim); } assert(idx == count - 1); *(result + idx) = 0; } return result; } liste importSouhait(const char* file) { FILE *fichier; char mot[255]; personne p; liste listeGenerale = creer(); fichier = fopen(file, "rt") ; if (fichier==NULL) { printf("Ouverture fichier impossible %s !", file); exit(1); } while ( fgets(mot, sizeof(mot), fichier) != NULL ) { char** token; token = str_split(mot, ','); if (token) { int i=0; while (*(token + i)) { p.nom = *(token + i); printf("[%s]\n", p.nom); i++; p.prenom = *(token + i); printf("[%s]\n", p.prenom); i++; p.choix_1 = *(token + i); i++; p.choix_2 = *(token + i); i++; int j; for(j=0; j<6; j++){ p.choix1.planete[j] = *(token + i); i++; } int k; for(k=0; k<6; k++){ p.choix2.planete[k] = *(token + i); i++; } int l; for(l=0; l<6; l++){ p.choix3.planete[l] = *(token + i); i++; } int m; for(m=0; m<6; m++){ p.choix4.planete[m] = *(token + i); printf("[%s]\n", p.choix4.planete[m]); i++; } free(*(token + i)); } printf("\n"); free(token); } } return NULL; } int main(void) { liste l = creer(); l = importSouhait("monfichier.csv"); return 0; }Pour les p.*** c'était pour les stocker dans une liste mais j'ai juste voulu faire des testes.