Файлы (то есть FILE*
дескрипторы) из <stdio.h>
не имеют структур записи. Они просто поток байтов. Даже fread читает байты (в некотором кратном заданному size
), но условно , вы могли бы решить они "записи ».
Вам необходимо определить и указать на бумаге (или хотя бы в каком-либо комментарии) ваш формат файла . Вы можете использовать нотацию EBNF для этой спецификации. Тогда вы могли бы использовать методы рекурсивного спуска для чтения этого файла. Вы можете предпочесть какой-нибудь формат в формате обычного текста , потому что его легче отлаживать. Затем вы можете прочитать каждую строку (с помощью fgets или getline
) и проанализировать каждую из них (возможно, также имея свой лексер ). Читайте про сериализацию , скорее всего это будет актуально.
Помните, что компьютеры работают очень быстро, а оперативная память всегда намного быстрее вашего диска (даже если это SSD). Вы можете предпочесть использование существующих текстовых форматов, таких как JSON , YAML , XML, потому что вы легко найдете существующие библиотеки для работы с ними. Помните, что стоимость обработки данных довольно часто намного меньше, чем стоимость ввода / вывода.
Если прямой доступ внутри вашего файла вызывает беспокойство, попробуйте использовать что-то вроде sqlite или GDBM . Код может быть проще.
Во многих случаях стоимость (или денежная стоимость) данных важнее стоимости программного обеспечения, обрабатывающего их. Не забудьте сделать резервную копию ваших данных.
Я не совсем понимаю ваше приложение, но я бы порекомендовал использовать в нем JSON или sqlite , используя существующие соответствующие библиотеки. Поскольку ваше время разработки (и стоимость) имеет большое значение.
Конечно, если ваши данные огромны (например, намного больше, чем ваша RAM, терабайт), у вас будут другие проблемы и разные подходы. Учитывая вашу тему (какие-то данные о людях; тогда вы можете быть обеспокоены GDPR , и у вас наверняка есть некоторые этические вопросы относительно таких данных, так как неэтично собирать данные о людях, не зная о данных, касающихся их), это маловероятно: нас меньше десяти миллиардов человек на земле, и каждая из ваших записей, вероятно, меньше 200 байтов, поэтому вся информация о каждом живом человеке помещается на одном жестком диске.
Также помните о C динамическом распределении памяти . Вам, вероятно, это нужно.
PS. Ориентированные на запись файлы существовали в эпоху мэйнфреймов (например, MVS , VMS ) в 1970-х или 1980-х годах. Современные операционные системы (читай Операционные системы: три простых компонента ), такие как Linux, Windows, Unix, Android, MacOSX, предоставляют абстракцию потока байтов для своих файлов, а также каталоги в их файловых системах . У многих СУБД выше этого или, возможно, какая-то абстракция значения ключа (например, GDBM, Киотский кабинет , REDIS , ...)