Ошибка ошибки сегментации при вводе значения в массив в структурированном массиве - PullRequest
0 голосов
/ 31 мая 2018

У меня проблема со структурой C. Я хочу написать программу, которая читает данные из grades.txt, сохраняет их в структурированном массиве и печатает их.Поэтому я написал код ниже этого. program.c

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

int main()
{
    FILE *fp1;
    fp1 = fopen("grades.txt","r");
    int i = 0,j;
    typedef struct
    {
        int number;
        int q[4];
        int total;
    } student;
    student a[101];
    while(feof(fp1) == 0)
    {
        if(i==0) i++;
        else
        {
            fscanf(fp1,"%d %d %d %d %d %d", &a[i].number, &a[i].q[0], &a[i].q[1], &a[i].q[2], &a[i].q[3], &a[i].total);
            printf("%d %d %d %d %d %d\n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);
            i++;
        }
    }
    fclose(fp1);
    return 0;
}

Однако он печатает значения мусора и ошибки ошибки сегментации.

778121006 7632239 778121006 7632239 0 -1399308296
Segmentation fault

А содержимое grades.txt равно

grades.txt

ID       Q1 Q2 Q3 Q4 Total
20131122 20 14 18 22    74
20132400 16 23 11 19    69

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Во-первых, вы не проверяли возвращаемое значение fopen(), так как если файл не существует, ваш код не должен выполнять дальнейшую операцию на fp1.Поэтому проверьте возвращаемое значение как

fp1 = fopen("grades.txt","r");
if(fp1 == NULL) {
   /* error handling */
}

Во-вторых, как упоминалось @paul Почему «while (! Feof (file))» всегда неверно? , вместо этого используйте fscanf() внутриwhile loop & проверьте возвращаемое значение fscanf() как

while(fscanf(fp1,"%d %d %d %d %d %d", &a[i].number, &a[i].q[0], &a[i].q[1], &a[i].q[2], &a[i].q[3], &a[i].total) == 6 ) { /* 6 is the no of read item */
      printf("%d %d %d %d %d \n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);
      i++; 
}

Некоторые глупые ошибки, которые вы допустили, поскольку было еще одно %d внутри printf() оператора, которое вы могли бы решить или наблюдать при компиляциис флагом -Wall.Это

printf("%d %d %d %d %d %d\n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);

с шестью %d, но вы предоставили только 5 аргументов, удалите лишние %d, так как есть только 5 аргументов.

0 голосов
/ 31 мая 2018

Вы должны пропустить первую строку.Вы увеличиваете i, но не пропускаете первую строку.Вы заставляете программу читать символы как целые.Возможно, что-то вроде

fscanf(fp1,"%s %s %s %s %s %s", ....(strings here) );

в блоке if

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...