Существует несколько проблем:
Внутри цикла записи вы можете записать данные для одного учащегося с индексом i .Также вы должны использовать размер структуры Student, а не полный размер данных для всех студентов.
В коде это будет выглядеть так:
n = write(fd, &stud[i], sizeof(struct Student));
Здесь &stud[i]
указывает на данные студента i .При использовании sizeof(struct Student)
записываются только данные для одного учащегося.
При считывании данных в память необходимо правильно рассчитать количество байтов.Пара скобок отсутствует.Он должен выглядеть следующим образом:
nobytes = sizeof(struct Student) * (pos - 1);
Если вы хотите вывести только одного студента, вы должны использовать , если вместо , тогда как :
if (read(fd, &pread, sizeof(pread)) == sizeof(pread)) {
Эта строка работает нормально, если описание файла ссылается на normal file
.
man 2 read
говорит:
Система гарантирует чтение количества запрошенных байтов, если дескриптор ссылается на обычный файл, у которого осталось столько байтов до конца файла, но ни в каком другом случае.
Но он может уже потерпеть неудачу, если используется сетевая файловая система.
Так что было бы лучше использовать что-то вроде:
ssize_t bytes_read = 0;
ssize_t n;
while ((n = read(fd, &pread + bytes_read, sizeof(pread) - bytes_read)) > 0) {
bytes_read += n;
}
Таким образом, если read
вернет только частичный результат, он также будет работать правильно.
Не забудьте потом проверить количество прочитанных байтов.Это может выглядеть так:
if(bytes_read == sizeof(pread)) {
printf("%s\n", pread.name);
printf("%s\n", pread.dob);
printf("%d\n", pread.id);
printf("%s\n", pread.sex);
} else {
printf("not enough data");
exit(1);
}