Ошибка сегментации с файлами в C - PullRequest
0 голосов
/ 19 марта 2019

Я начинаю писать код на Си для учебы, но у нас нет курсов или уроков.У меня ошибка сегментации 11 с простой программой, и я не знаю почему.Мне нужно использовать файлы btw: thx для помощи ^^

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int i;

typedef struct Passager{
    char nom[20];
    char prenom[20];
    int age;
    int num_siege;
} Passager;
Passager liste_passagers[30]; //30 = nombre de passagers

int main()
{
    FILE* fichier = NULL;
    fichier = fopen("/Users/Patoch/Desktop/Patoch /UNI/Informatique/info sem 2/Structure de données/Labo/TP3/Passager2.txt", "r");

    if (fichier == NULL)
    { //test de la bonne ouverture du fichiers
        printf("Impossible d'ouvrir le fichier Passagers.docx");
        exit(EXIT_FAILURE); 
    }   

    for (i=0; i<(sizeof(liste_passagers)/sizeof(liste_passagers[0])); i++)
    {
        fscanf(fichier, "%s %s %d %d", liste_passagers[i].nom, liste_passagers[i].prenom, &liste_passagers[i].age, &liste_passagers[i].num_siege);
        printf("nom : %s \n", liste_passagers[i].nom);

    }

    fclose(fichier); 
    return 0;
}

1 Ответ

0 голосов
/ 20 марта 2019

Должно быть nom и prenom пространство определения слишком мало, попробуйте позволить fscanf выделять пространство, когда он этого хочет.

как:

fscanf(fp, "%ms", &ptr);

модифицированный код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int i;

typedef struct Passager {
    char *nom;
    char *prenom;
    int age;
    int num_siege;
} Passager;
Passager liste_passagers[30]; //30 = nombre de passagers

int main()
{
    FILE *fichier = NULL;
    fichier = fopen("Passager2.txt", "r");

    if (fichier == NULL) {
        //test de la bonne ouverture du fichiers
        printf("Impossible d'ouvrir le fichier Passagers.docx");
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < (sizeof(liste_passagers) / sizeof(liste_passagers[0])); i++) {
        fscanf(fichier, "%ms %ms %d %d",
               &liste_passagers[i].nom, &liste_passagers[i].prenom,
               &liste_passagers[i].age, &liste_passagers[i].num_siege);
        printf("nom : %s \n", liste_passagers[i].nom);
        free(liste_passagers[i].nom);
        free(liste_passagers[i].prenom);
    }

    fclose(fichier);
    return 0;
}
...