Структуры – производные типы данных языка С
Задание 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?
- Как объявляется массив структур?
- Как объявляется указатель на структуру?
- Как инициализируется указатель на структуру?
- Как осуществляется инициализация полей структуры, определенных как символьные массивы?
- Какой оператор может быть использован для определения структурного типа данных?
- Является ли тег структуры именем ее типа?
 
                             


