Проблема возникает из-за передачи sizeof(buffer)
в fgets()
. buffer
является указателем, а sizeof(buffer)
вернет либо 4
, либо 8
в зависимости от базовой архитектуры 32
бит или 64
бит. Измените это на:
while(fgets(buffer, sizeof(struct Prova), f))
когда вы выделяете sizeof(struct Prova)
размер для buffer
.
Это также не правильное решение проблемы. Причина -
Скажите, ваш файл содержит следующие данные:
abcdefghijklmno 123456789
Длина имени составляет 15
символа, который может содержать элемент nome
, а элемент id
также может содержать число 123456789
, так как оно меньше INT_MAX
. fgets
читает символы из потока, а размер указанных выше данных составляет 25
символов. В вашем коде вы выделяете размер памяти sizeof(struct Prova)
для buffer
, а размер struct Prova
равен 20
байт. Следовательно, для данных, приведенных выше, buffer
не выделяется достаточно памяти для чтения всей строки за один раз, потому что fgets
читает до тех пор, пока не будет прочитано size-1
символов, либо не будет либо новая строка, либо конец файла. достигнуто, что произойдет первым. Таким образом, в этом случае частичная строка будет прочитана и передана в sscanf()
, а остальная часть строки будет прочитана в следующей итерации и передана в sscanf()
, что даст неверные результаты.
Не следует выделять память для buffer
в зависимости от размера struct Prova
. Вместо этого я бы предложил взять buffer
большего размера, например, так (нет необходимости выделять его динамически):
char buffer[100];
убедитесь, что он должен быть достаточно большим, чтобы вместить строку файла в одном чтении fgets
или изменить ваш код так, чтобы он не заполнял p.nome
и p.id
, пока fgets
не достигнет символа новой строки или EOF, т.е. Обязательно прочитайте всю строку, а затем только sscanf()
p.nome
и p.id
.