Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3125 / 711 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 14:

Структуры – производные типы данных языка С

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >

Задание 5

  1. С клавиатуры введите данные о себе (буквами русского алфавита), выведите информацию на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
  2. Поменяйте операторы стрелка на операторы точка, и наоборот.
  3. Вместо функций malloc() примените функции calloc().
  4. Вместо указателей *NAME, *SURNAME примените массивы символов
  5. Предусмотрите нумерацию полей структуры, например, 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.

Вариант записи информации в двоичный файл

Рис. 13.6. Вариант записи информации в двоичный файл
Результат чтения из двоичного файла

Рис. 13.7. Результат чтения из двоичного файла

Задание 6

  1. Перезапишите информацию из файла data12.dat в двоичный файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа. Символьные массивы полей структуры задайте с помощью указателей.
  2. Запись данных произведите в двоичный файл с различными расширениями: .txt, .bin, .doc. Определите размеры этих файлов в байтах.
  3. Напишите программу записи массива структур в двоичный файл и чтения из него всей структуры с выводом результатов на консоль.

Контрольные вопросы

  1. Как определяется структура в языке С?
  2. Как объявляется структура в языке С?
  3. Какими способами можно объявить новые структурные переменные?
  4. Какие форматы используются для доступа к элементам структуры?
  5. Что такое вложенная структура?
  6. Какой уровень вложенности структур поддерживается стандартом С89?
  7. Как объявляется массив структур?
  8. Как объявляется указатель на структуру?
  9. Как инициализируется указатель на структуру?
  10. Как осуществляется инициализация полей структуры, определенных как символьные массивы?
  11. Какой оператор может быть использован для определения структурного типа данных?
  12. Является ли тег структуры именем ее типа?
< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов