C中文件的分段错误

时间:2019-03-19 16:26:04

标签: c file segmentation-fault

我开始用C语言编写学习代码,但没有任何课程或课程。 我有一个简单程序的分段错误11,我不知道为什么。我需要使用文件顺便说一句: 寻求帮助^^

#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 :(得分:0)

应该是nomprenom定义空间太小,请尝试让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;
}