Ядро сбрасывается после использования fseek в c - PullRequest
0 голосов
/ 24 января 2019

Я написал код, и у меня возникли некоторые проблемы с определенной частью функции.Я получаю «core dumped», если я добавляю функцию fseek, но если я удаляю ее, все работает нормально.

Это часть моего кода с проблемой:

    FILE* fe;

    fe=fopen("fete","rb");
    if (fe==NULL)
    {
        printf("eroare");
        exit(1);
    }

    STUDENT* x;
    int i;
    long int nrfete=0;
    **fseek(fe,0L,SEEK_END);**
    printf("%ld",ftell(fe));
    nrfete = ftell(fe)/sizeof(STUDENT);
    x=(STUDENT*)malloc(nrfete*sizeof(STUDENT));

    fread(&x,sizeof(STUDENT),nrfete,fe);
    printf("%s",x[0].prenume);//pt verificare
    fclose(fe);

От комментарий

typedef struct { 
  char prenume[20];
  char sex;
  float nota;
} STUDENT;

Ответы [ 3 ]

0 голосов
/ 24 января 2019

как я вижу, вы стремитесь к концу файла

fseek(fe,0L,SEEK_END);

затем вы размещаете данные для структуры STUDENT

x=(STUDENT*)malloc(nrfete*sizeof(STUDENT));

тогда вы пытаетесь прочитать это:

fread(&x,sizeof(STUDENT),nrfete,fe);

но я думаю, что вы получите ошибку здесь. Потому что вы уже в конце файла. Таким образом, вы не заполняете данные, и у вас есть мусор в переменной x. В этом случае x [0] .prenume не является строкой с нулевым символом в конце. Таким образом, вы получаете сообщение об ошибке при попытке его напечатать.

чтобы проверить, правильно я или нет, вы можете заполнить выделенную память нулями после выделения, в этом случае вы не получите ошибку (но структура все равно будет пустой):

memset (x, '\ 0', nrfete * sizeof (STUDENT));

Вы также можете распечатать результат fread ()

0 голосов
/ 24 января 2019
STUDENT* x;
...
x=(STUDENT*)malloc(nrfete*sizeof(STUDENT));
..
fread(&x,sizeof(STUDENT),nrfete,fe);

x указывает на блок памяти, & x - указатель на x, который составляет всего 4 байта.

Измените fread на следующее, чтобы решить проблему:

fread(x, sizeof(STUDENT),nrfete,fe);
0 голосов
/ 24 января 2019

В частности, две ошибки:

Вы должны rewind или fseek файл вернуться к началу, до того, как fread будет сделано. В существующем состоянии он не будет читать никаких данных, поэтому выделенная память все еще содержит значения мусора.

И всегда проверяйте возвращаемое значение функций ввода / вывода, например fread, которое сообщило бы вам, что данные не были прочитаны.

Другая проблема - буфер, переданный в fread, который должен быть указателем, полученным malloc, а не адресом, где хранится указатель. Итак

fread(&x,sizeof(STUDENT),nrfete,fe);

должно быть

if(fread(x, sizeof(STUDENT), nrfete, fe) != nrfete) {
    // report error
}
...