Структуры – производные типы данных языка С
Задание 5
- С клавиатуры введите данные о себе (буквами русского алфавита), выведите информацию на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
- Поменяйте операторы стрелка на операторы точка, и наоборот.
- Вместо функций malloc() примените функции calloc().
- Вместо указателей *NAME, *SURNAME примените массивы символов
- Предусмотрите нумерацию полей структуры, например, 1) Name: Peter и т.д.
Пример 6. Напишите программу записи структуры в двоичный файл и чтения ее из двоичного файла.
Решение примера разобьем на две части: создадим структуру и произведем пакетную запись в файл этой структуры. Потом операцию записи закомментируем, изменим поля структуры и выполним чтение из файла структуры.
Для динамического распределения памяти применим функцию malloc() и символьные указатели в качестве инициализаторов структуры.
Программный код решения примера:
#include <stdio.h> #include <conio.h> #include <string.h> #define MAX 80 // Предполагаемое число символов // шаблон структуры struct stud { char name[MAX+1]; // массив символов имени студента char surname[MAX+1]; // массив символов фамилии студента char ACOUY[MAX+1]; // специальность int age; // возраст - полных лет float av_mark; // средняя успеваемость }; int main (void) { char NAME[MAX+1], SURNAME[MAX+1], SPEC[MAX+1]; FILE *fid; // условная инициализация переменной структуры и // определение указателя на структуру struct stud TABLE = {"--", "--", "--", 0, 0.0}, *PTR; PTR = &TABLE; // инициализация указателя на структуру printf("\n Enter a name of student: "); gets_s(NAME, MAX); printf(" Enter a surname of student: "); gets_s(SURNAME, MAX); printf(" Enter a speciality: "); gets_s(SPEC, MAX); // Занесение имени в структуру strcpy_s(PTR->name, strlen(NAME)+1, NAME); // Занесение фамилии в структуру strcpy_s(PTR->surname, strlen(SURNAME)+1, SURNAME); // Занесение названия специальности в структуру strcpy_s(PTR->ACOUY, strlen(SPEC)+1, SPEC); printf("Enter the age of the student: "); scanf_s("%d", &TABLE.age); printf(" Enter the average mark student: "); scanf_s("%f", &TABLE.av_mark); puts("\n======= Varient field of structure ============"); printf("\n Name: %s\n Surname: %s\n \ Specialisation: %s\n Age: %d\n Average mark: %0.2f\n ", \ PTR->name, PTR->surname, PTR->ACOUY, PTR->age, PTR->av_mark ); puts("\n================================================\n"); if ( fopen_s(&fid, "D:\\data12.dat", "wb") ) {printf("\n File could not be opened\n"); printf("\n Press any key: "); _getch(); return 0; } //Пакетная запись в двоичный файл fwrite(PTR, sizeof(struct stud), 1, fid); fclose(fid); //if ( fopen_s(&fid, "D:\\data12.dat", "rb") ) //{printf("\n File could not be opened\n"); //printf("\n Press any key: "); //_getch(); return 0; } // Чтение из двоичного файла //fread(PTR, sizeof(struct stud), 1, fid); //puts("\n===== Variants of fields of structure ====="); //printf("\n Name: %s\n Surname: %s\n \ //Specialisation: %s\n Age: %d\n Average mark: %1.2f\n ", \ //PTR->name, PTR->surname, PTR->ACOUY, PTR->age, PTR->av_mark ); //puts("\n===============================================\n"); //fclose(fid); printf("\n\n Press any key: "); _getch(); return 0; }
Форматы записи в двоичный файл и чтения из двоичного файла:
fwrite(PTR, sizeof(struct stud), 1, fid); fread(PTR, sizeof(struct stud), 1, fid);
В функции fwrite() первый параметр PTR определяет собой содержимое структуры (данных в других случаях), которое по указателю *fid на файл записывается в файл. Второй параметр sizeof(struct stud) определяет собой размер в байтах. Третий параметр 1 – это количество блоков, которое будет записываться в файл. При этом второй и третий параметры перемножаются, поэтому их можно поменять местами.
В программе чтение из двоичного файла закомментировано. Для корректной работы программы сделана условная инициализация полей структуры, чтобы прописать адрес структуры в памяти с данными.
Возможный вариант выполнения программы при записи информации в двоичный файл показан на рис. 13.6. После комментирования программного кода с записью в файл и снятия комментариев к программному коду чтения из файла результат выполнения программы показан на рис. 13.7.
Задание 6
- Перезапишите информацию из файла data12.dat в двоичный файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа. Символьные массивы полей структуры задайте с помощью указателей.
- Запись данных произведите в двоичный файл с различными расширениями: .txt, .bin, .doc. Определите размеры этих файлов в байтах.
- Напишите программу записи массива структур в двоичный файл и чтения из него всей структуры с выводом результатов на консоль.
Контрольные вопросы
- Как определяется структура в языке С?
- Как объявляется структура в языке С?
- Какими способами можно объявить новые структурные переменные?
- Какие форматы используются для доступа к элементам структуры?
- Что такое вложенная структура?
- Какой уровень вложенности структур поддерживается стандартом С89?
- Как объявляется массив структур?
- Как объявляется указатель на структуру?
- Как инициализируется указатель на структуру?
- Как осуществляется инициализация полей структуры, определенных как символьные массивы?
- Какой оператор может быть использован для определения структурного типа данных?
- Является ли тег структуры именем ее типа?