динамическое распределение памяти для структуры при чтении из файла в C ++
==========================================================================

У меня есть структура

И я'Я записываю его содержимое в двоичный файл.

Я пишу в разное время и имею много данных в файле, которые написаны из этой структуры.

Теперь я хочу прочитать ВСЕ данные, которые есть в двоичном файле, в структуре. Я'Я не уверен, как я могу выделить память (динамически) для структуры, чтобы структура могла вместить все данные в структуре.

Можете ли вы помочь мне с этим.

Код:

Вы должны использовать`vector` вместо массивов старого стиля. Он будет обрабатывать динамическое распределение (использовать`push_back()` добавить элементы), и вы можете получить его размер с`size()` метод.

**РЕДАКТИРОВАТЬ:** Для чтения файла вы можете сделать что-то вроде этого:

Дон»Не забудьте добавить бинарные опционы тоже.

Для`name` внутри вашего`student_t` структура, было бы намного проще объявить его как`string`, Таким образом, вы бы ненужно использовать`strcpy` и тому подобное, и вы могли бы просто напечатать`mystudent.name = "jimmy"`



Самый простой подход - распаковать вектор так, чтобы вы записывали в файл не вектор, а массив целых чисел вместе с числом целых в массиве.

Таким образом, первым этапом будет запись первой части, которая имеет стандартную неизменную структуру, затем число, которое указывает число последующих целых чисел, а затем, наконец, итерацию по вектору, записывающему целые числа в файл.

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



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

Первое число (2) дает количество структур, хранящихся в файле. Затем следуют блоки данных. Каждый блок данных начинается с числа, которое определяет размер`grades` вектор (13 для первой структуры, 8 для второй).

В этом случае вы читаете int в начале файла. Теперь вы знаете, что в файле сохранены 2 структуры. Затем вы читаете следующий int, 13 в этом случае. Это говорит о том, что вам нужен вектор с емкостью 13. Вы можете создать его, а затем прочитать все ваши значения. Вы будете знать, когда остановиться, поскольку знаете, сколько данных у вас есть в этой структуре: 10 символов (имя), 1 тип (возраст), 13 дюймов (классы). После того, как вы прочитали все это, вы знаете, что следующий int будет частью следующей структуры в файле. Это будет число 8, которое говорит вам, что следующей структуре нужен вектор емкости 8.

И т. Д., И т. Д., Пока вы не прочитаете все.

Обратите внимание, что этот метод ввода / вывода двоичных файлов не является переносимым. Для этого есть две причины. Во-первых, размер int может отличаться для разных платформ. Во-вторых, способ, которым int (и другие данные, превышающие один байт) хранятся в двоичной форме, также может отличаться, даже если они имеют одинаковый размер (см.[http://en.wikipedia.org/wiki/Endianness](https://en.wikipedia.org/wiki/Endianness) для объяснения.) Но если вы неЕсли ваша программа и файлы, которые она генерирует, в любом случае будут переносимыми, то описанного выше метода будет достаточно.