Как заполнить массив структур из файла

Обновлено: 29.06.2024

В этом руководстве рассказывается, как создать массив структур в C. Это набор нескольких структурных переменных, где каждая переменная содержит информацию о разных объектах.

Массив структур в C

Массив — это последовательный набор данных одного и того же типа, а структура — это пользовательский тип данных. Объявление массива структур такое же, как и для массива примитивных типов данных, но использует тип данных элементов структуры.

Рассмотрите пример структуры с именем Student, как показано ниже:

Мы можем объявить массив структур, как показано ниже.

Здесь studentRecord представляет собой массив из 5 элементов, каждый из которых имеет тип struct Student . Доступ к отдельным элементам осуществляется с помощью нотации индекса ( [] ), а доступ к членам осуществляется с помощью точки . оператор.

studentRecord[0] указывает на 0-й элемент массива, а studentRecord[1] указывает на первый элемент массива.

  • СтудентЗапись[0].rollNumber ссылается на элемент rollNumber 0-го элемента массива.
  • СтудентЗапись[0].studentName ссылается на член studentName 0-го элемента массива.
  • СтудентЗапись[0].percentage относится к процентному члену 0-го элемента массива.

Полная программа для объявления массива структуры в C выглядит следующим образом.

Создание массива структур с помощью функции malloc() в C

Есть еще один способ создать массив struct в C. Память можно выделить с помощью функции malloc() для массива struct . Это называется динамическим выделением памяти.

Функция malloc() (выделение памяти) используется для динамического выделения одного блока памяти заданного размера. Эта функция возвращает указатель типа void .

Возвращаемый указатель может быть приведен к указателю любой формы. Он инициализирует каждый блок значением мусора по умолчанию.

Синтаксис функции malloc() следующий:

Полная программа для динамического создания массива структур представлена ​​ниже.

Статьи DelftStack написаны такими же фанатами программного обеспечения, как и вы. Если вы также хотите внести свой вклад в DelftStack, написав платные статьи, вы можете посетить страницу «Написать для нас».

Статья по теме — Массив C

Статья по теме — Структура C


сообщить об этом объявлении

Объявление массива структур аналогично объявлению массива фундаментальных типов. Так как массив представляет собой набор элементов одного типа. В массиве структур каждый элемент массива относится к типу структуры.

Давайте рассмотрим пример:

Вот как мы можем объявить массив структуры car .


Здесь arr_car — это массив из 10 элементов, каждый из которых имеет тип struct car. Мы можем использовать arr_car для хранения 10 структурных переменных типа struct car. Для доступа к отдельным элементам мы будем использовать индексную запись ( [] ), а для доступа к членам каждого элемента мы будем использовать оператор точки ( . ), как обычно.

<р>и так далее. Точно так же

Напоминаем, что приоритет индекса массива [] и оператора точки ( . ) одинаков, и они оцениваются слева направо. Поэтому в приведенном выше выражении применяется первый индекс массива ( [] ), за которым следует оператор точки ( . ). Индекс массива ( [] ) и оператор точки ( . ) одинаковы, и они оцениваются слева направо. Поэтому в приведенном выше выражении сначала применяется индекс массива [], за которым следует оператор точки ( . ).

Давайте перепишем программу, которую мы использовали в предыдущей главе в качестве введения в структуры.

Ожидаемый результат:

Как это работает:

В строках 5–10 мы объявили структуру под названием student .

В строке 14 мы объявили массив структур типа struct student, размер которого контролируется символической константой MAX . Если вы хотите увеличить/уменьшить размер массива, просто измените значение символьной константы, и наша программа адаптируется к новому размеру.

В строках 17–29 первый цикл for используется для ввода сведений об учащемся.

В строках 36–40 второй цикл for выводит все сведения об учащемся в виде таблицы.

Мы также можем инициализировать массив структур, используя тот же синтаксис, что и для инициализации массивов. Возьмем пример:

Мы планировали выйти на пенсию летом 2020 года и увидеть мир, но из-за коронавируса мы вынуждены много программировать на Python 3 и PHP 7.
Теперь мы можем предложить индивидуальное онлайн-обучение – в небольших группах, в режиме реального времени. репетиторов - очень хорошо работает для групп от 4 до 14 делегатов. Во всем мире; язык курса английский.

Пример структур и объединений из учебного курса Well House Consultants
Подробнее о структурах и объединениях [ссылка]

Этот пример описан в следующих статьях:
• Структуры v Указатели структур в C. Как, что, почему. - [ссылка]

/* Примеры строк данных
5 0 Среда Солнечно
6 2 Четверг Влажно
*/

int main() /* Определяем структуру daydata */
typedef struct int n_adults; интервал n_kids;
char day[10]; угольная погода[10];
> дневные данные ;
запись дневных данных[30];
ФАЙЛ * дескриптор файла;
Чар Лайн[121];

char *item;
целый счет = 0;
интервал к;

/* А вот и действия! */
/* открыть файл */

/* Читать файл построчно */

в то время как (fgets(lyne,120,дескриптор файла)) printf("%s",lyne);

item = strtok(lyne," ");
запись[запись].n_adults = atoi(item);

item = strtok(NULL," ");
запись[запись].n_kids = atoi(item);

item = strtok(NULL," ");
strcpy(запись[счет].день,элемент);

item = strtok(NULL,"\n");
strcpy(record[reccount].weather,item);

/* Цикл и отчет по данным */

printf("Запись погоды\n");
for (k=0; k printf("Это %s\n",record[k].weather);
>

Да. В нашей библиотеке более 700 книг. Книги по C и C++ перечислены здесь, и когда вы выберете подходящую книгу, мы свяжем вас с Amazon для заказа.

Этот пример взят из нашего учебного модуля "Структуры и объединения". Вы найдете описание темы и некоторые другие тесно связанные примеры на главной странице модуля «Структуры и объединения».

Вы можете узнать больше об этом примере на учебных курсах, перечисленных на этой странице, на которых вам будет предоставлен полный набор учебных заметок.

Многие другие учебные модули доступны для загрузки (для ограниченного использования) из нашего центра загрузки по лицензии Open Training Notes.

• В нашем центре решений есть ряд более объемных технических статей.
• Наш архив форума Opentalk содержит центр вопросов и ответов.
• Лошадиный рот дает ежедневный совет или мысль.
• Дополнительные ресурсы доступны через ресурсный центр.
• Все эти ресурсы можно найти с помощью нашей поисковой системы.
• И здесь есть глобальный указатель.

Данный веб-сайт создан и поддерживается Well House Consultants.

Это пример программы, демонстрация класса или ответ из учебного курса. Его основная цель — предоставить послекурсовое обслуживание клиентам, которые посещали наши общедоступные частные курсы или курсы на месте, но примеры общедоступны на условиях, описанных ниже.

Посетители наших учебных курсов могут использовать отдельные примеры в процессе программирования, но они должны проверять используемые ими примеры, чтобы убедиться, что они подходят для их работы. Помните, что некоторые из наших примеров показывают вам, как нельзя делать что-либо — проверьте свои заметки. Well House Consultants не несет ответственности за соответствие этих примеров программ потребностям клиентов.

Эта программа защищена авторским правом Well House Consultants Ltd. Вам запрещается использовать ее для проведения собственных учебных курсов без нашего предварительного письменного разрешения. Дополнительную информацию см. на нашей странице о предоставлении учебных курсов.

Ни одно из наших изображений в этом коде НЕ МОЖЕТ быть повторно использовано на общедоступном URL-адресе без нашего предварительного разрешения. Для добросовестного личного использования мы часто даем вам разрешение при условии, что вы предоставите обратную ссылку. При коммерческом использовании на веб-сайте за каждое используемое изображение взимается лицензионный сбор. Подробности по запросу.

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

Создать скалярную структуру

Сначала создайте структуру под названием "пациент", в которой есть поля для хранения данных о пациенте. На диаграмме показано, как структура хранит данные. Такая структура, как пациент, также называется скалярной структурой, поскольку переменная хранит одну структуру.


Используйте запись через точку, чтобы добавить поля name , billing и test , назначив данные каждому полю. В этом примере синтаксис пациента.имя создает как структуру, так и ее первое поле. Следующие команды добавляют дополнительные поля.

Доступ к значениям в полях

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

Например, измените значение поля оплаты.

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

Рисунок содержит объект осей. Объект осей с Заголовок

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

Рисунок содержит объект осей. Объект осей содержит объект типа bar.

Индексировать в массив нескалярных структур

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

Например, добавьте вторую структуру к пациентам, имеющим данные о втором пациенте. Кроме того, присвойте исходное значение 127 полю выставления счетов первой структуры. Так как массив теперь имеет две структуры, вы должны получить доступ к первой структуре путем индексации, как в пациента(1).billing = 127 .

В результате пациент представляет собой массив структур 1 на 2, содержимое которого показано на диаграмме.


Каждая запись пациента в массиве представляет собой структуру класса struct . Массив структур иногда называют массивом структур . Однако термины массив структур и массив структур означают одно и то же. Как и другие массивы MATLAB®, массив структур может иметь любые размеры.

Массив структур имеет следующие свойства:

Все структуры в массиве имеют одинаковое количество полей.

Все структуры имеют одинаковые имена полей.

Поля с одним и тем же именем в разных структурах могут содержать данные разных типов или размеров.

Если вы добавите в массив новую структуру, не указав все ее поля, то неуказанные поля будут содержать пустые массивы.

Чтобы проиндексировать массив структур, используйте индексацию массива. Например, пациент(2) возвращает вторую структуру.

Чтобы получить доступ к полю, используйте индексацию массива и запись через точку. Например, верните значение поля выставления счетов для второго пациента.

Вы также можете индексировать массив, хранящийся в поле. Создайте гистограмму, отображающую только первые два столбца пациента(2).test .

Рисунок содержит объект осей. Объект осей содержит 2 объекта типа bar.

Примечание

Вы можете индексировать часть поля, только если вы ссылаетесь на один элемент массива структур. MATLAB ® не поддерживает операторы типа пациента(1:2).test(1:2,2:3) , которые пытаются индексировать поле для нескольких элементов массива структур. Вместо этого используйте функцию arrayfun.

 Фред Сигворт

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

4 комментария

 Андрей Бобров

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Фред Сигворт

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

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

 Густаво Дельфино

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Стивен

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

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

В качестве демонстрации и простого теста я написал эту функцию (ниже). Для простоты его нужно вызывать в монотонной последовательности с шагом 1 или -1, то есть либо 1, 2, . N-1, N или N, N-1, . 2, 1 .

Принятый ответ

 Уолтер Роберсон

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

Вы правы, struct() — это структура без полей, и это отдельная структура, которая отличается от структуры с любыми определенными полями.

Кроме того, если я правильно помню, существует вклад MATLAB File Exchange для выполнения назначения между разнородными структурами.

4 комментария

 КАЭ

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Вальтер, я полагаю, вы имеете в виду этот вклад FEX в "объединение структур с разными именами полей путем добавления пустых отсутствующих полей".

 Уолтер Роберсон

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Фред Сигворт

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Спасибо! Думаю, мне, наконец, придется научиться использовать arrayfun и анонимные функции :), но выглядит круто.

 томмш

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

@Fred Нет необходимости изучать функции arrayfun и анонимные функции. Это величины медленнее, чем обычные циклы for.

Еще ответы (12)

 Ромеш

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

2 комментария

 Ричард Крозье

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Уолтер Роберсон

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Ричард, это не удовлетворяет первоначальному требованию, чтобы запись структуры была результатом выполнения CreateAStruct с аргументом, равным индексу.

 Филипп Боргезани

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

На самом деле самое простое и быстрое решение этой проблемы — не пытаться создать пустую структуру. Запустите цикл в обратном направлении, чтобы выделить полный массив структур в первом цикле:

2 комментария

 Стивен

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Джефф Миллер

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

К сожалению, это не работает с parfor, потому что его диапазон должен увеличивать последовательные целые числа. Но это вроде нормально:

 Фернандо Фрейташ Алвес

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

0 комментариев

 Шон де Вольски

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

Вам нужно установить значение для поля структуры, так как именно так индексируются структуры. Вы также можете изучить использование массивов ячеек:

3 комментария

 Фред Сигворт

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Спасибо, Шон, ваш код работает. Но когда я затем пытаюсь присвоить всю большую структуру одному элементу массива, это дает ошибку:

Я хочу иметь возможность сделать это, потому что я хочу создать массив (не знаю заранее, сколько элементов) структур, которые имеют 20 или около того полей..

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

 Шон де Вольски

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Натаниэль Джонс

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Шон, использование массива ячеек структур приводит к следующей ошибке при попытке назначить структуры как элементы массива ячеек:

 Самуил

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

1 комментарий

 Уолтер Роберсон

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Это не удовлетворяет исходному требованию, чтобы запись структуры была результатом выполнения CreateAStruct с аргументом, равным индексу.

 Дьен Нгуен

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

1 комментарий

 Уолтер Роберсон

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Это не удовлетворяет исходному требованию, чтобы запись структуры была результатом выполнения CreateAStruct с аргументом, равным индексу.

 ДЭХО КИМ

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

3 комментария

 Фред Сигворт

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 ДЭХО КИМ

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

 Стивен

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Для этого требуется, чтобы поля структуры были известны заранее, а это не то, что требовалось в вопросе.

 Дэвид Янг

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

Описание различных типов пустых структур и функции, позволяющей легко создавать каждый тип, см. в моем представлении File Exchange emptyStruct

0 комментариев

 Франческо Онорати

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

1 комментарий

 Стивен

Прямая ссылка на этот комментарий

Прямая ссылка на этот комментарий

Для этого требуется, чтобы поля структуры были известны заранее, а это не то, что требовалось в вопросе.

 Бруно Луонг

Прямая ссылка на этот ответ

Прямая ссылка на этот ответ

Был там, сделал это. Самый общий способ справиться с такой ситуацией — это использовать функцию CATSTRUCT, которую я создал (прикреплен здесь).

Функция CATSTRUCTS может работать со списком непохожих друг на друга структур, поэтому ее возможное использование является очень общим. Функция MYFUN может возвращать непохожие структуры от итерации к итерации. Это, конечно, имеет некоторые потери скорости, когда структура объединяется в последнем выражении по сравнению со стандартными функциями, такими как horzcat, vertcat, cat(dim, c

Читайте также: