C/C++

Как достать числа из бинарного файла и работать с ними? Си

Мне нужно сложить количество студентов. Которые ввёл пользователь, заполняя структуру об университете. Однако их неопределённое количество. Как вытащить все? Как вообще вытащить какие-либо данные их бинарного файла?
Функция fread
https://www.cplusplus.com/reference/cstdio/fread/
Если непонятно описание на английском, можно найти на русском.
Или при помощи fgetc можно читать файл по одному байту
https://www.cplusplus.com/reference/cstdio/fgetc/
Неопределённое количество чисел не всегда возможно прочитать, поскольку непонятно, когда завершать чтение. Если в файле больше ничего нет, то это возможно, поскольку размер файла можно определить.
ЕБ
Ербол Буран
58 065
Лучший ответ
Игнат Громов Нет, в файле так же другие данные структуры. Имя ВУЗа, количество факультетов.
Игнат Громов Функция fread позволяет нам лишь вывести на экран значения, хранящиеся в файле. Разве нет?
Так вам числа читать или структуры?
В любом случае, есть два варианта:
1. Размер данных заранее известен (например число типа long занимает 4 байта).
2. Размер данных неизвестен и их надо как-то отделять друг от друга (присутствует какой-то символ-разделитель или указана длина записи.

Первый вариант самый простой и самый быстрый, так как мы можем сразу же прочитать с буфер много блоков а потом легко получить доступ к любому из них по его индексу в массиве.

Второй вариант медленный и более трудный, кроме того, мы не можем сразу получить доступ к произвольному блоку, надо будет пройти все те, что стоят перед ним. Но зато можно сильно экономить занимаемое место.
Можно также считывать данные побайтно, но это самый поганый по быстродействия вариант.

Возвращаясь на нашим баранам. Допустим у вас есть структура вида:
struct Student
{
unsigned long id; // Идентификатр
char name[64]; // ФИО длиною до 63 символов
unsigned long course; // Курс
};

Чтобы почитать кучу таких структур надо:
1. Выделить кусок памяти под них.
size_t max_s = 1000; // Максимальное кол-во струдентов, которое можем прочитать за раз
size_t mem_size = sizeof(struct Student) * max_s;
struct Student* sbuf = (struct Student*)malloc( mem_size );
// если выделение прошло успешно то считаем блок данных
if( sbuf )
// db_fd - файловый дескриптор базы данных студентов
// n_bytes - количество считанных байт или 0 если файл кончился или -1 в случае ошибки чтения
ssize_t n_bytes = read( db_fd, sbuf, mem_size );
// Узнаем количество считанных записей о студентах.
size_t n_rec = n_bytes / sizeof(struct Student);

Если засунуть это в цикл и читать до тех пор, пока не кончится файл со студентами, то суммируя n_rec можно узнать, сколько всего в файле записей.

Еще один вариант, если нам не нужно в процессе обрабатывать какие-то данные а нужно просто узнать количество записей фиксированной длины:
// при помощи lseek переходим на конец файла
off_t file_size = lseek( db_fd, 0, SEEK_END );
// Узнаем количество записей о студентах.
size_t n_rec = file_size / sizeof(struct Student);