Телефонный справочник: Сохранение и загрузка массива структур - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <conio.h>
#include <locale>
#include "Functions.h"
#define _CRT_SECURE_NO_WARNINGS
#define COUNT 100
struct PhoneBook
{
int N;
char Family;
char Name;
char Patronymic;
struct Phone
{
int Home;
int Work;
int Mobile;
};
struct Address
{
char Country;
char City;
char Street;
int N_Home;
int N_Apartment;
};
char Email;
} PB[COUNT];
const char header[] =
"|---------------------------------------------------------------------------------------------------------------|\n"
"| | | | | Phone | Address | |\n"
"| № | Family | Name | Patronymic |---------------|----------------------| Email |\n"
"| | | | | Home | Country | |\n"
"| | | | | Work | City | |\n"
"| | | | | Mobile | Street | |\n"
"| | | | | | № Home | |\n"
"| | | | | | № Apartament | |\n"
"|---------------------------------------------------------------------------------------------------------------|\n";
void main()
{
setlocale(LC_ALL, "RUSSIAN");
getch();
}#include <stdio.h>
#include <conio.h>
#include "Main.cpp"
#define _CRT_SECURE_NO_WARNINGS
void save(PhoneBook* PB[], COUNT)
{
FILE *fp;
register int i;
if((fp=fopen("PhoneBook.txt", "wb"))==NULL)
{
printf("Ошибка при открытии файла.\n");
return;
}
for(i=0; i<COUNT; i++)
if(*PB[i].Name)
if(fwrite(&PB[i], sizeof(struct PhoneBook), 1, fp)!=1)
printf("Ошибка при записи файла.\n");
fclose(fp);
}
void load(PhoneBook* PB[], COUNT)
{
FILE *fp;
register int i;
if((fp=fopen("PhoneBook.txt", "rb"))==NULL)
{
printf("Ошибка при открытии файла.\n");
return;
}
//init_list();
for(i=0; i<COUNT; i++)
if(fread(&PB[i], sizeof(struct PhoneBook), 1, fp)!=1)
{
if(feof(fp)) break;
printf("Ошибка при чтении файла.\n");
}
fclose(fp);
}Решение задачи: «Телефонный справочник: Сохранение и загрузка массива структур»
#define COUNT 1000
const char* FileName = "PhoneBook.txt";
struct PhoneBook
{
char N[100];
char Family[100];
char Name[100];
char Patronymic[100];
struct TPhone
{
char Home[100];
char Work[100];
char Mobile[100];
} Phone;
struct TAddress
{
char Country[100];
char City[100];
char Street[100];
char N_Home[100];
char N_Apartment[100];
} Address;
char Email[100];
} PB[COUNT];
void Save()
{
FILE *fp;
int i;
fp = fopen(FileName,"w");
for (i = 0; i < COUNT; i++)
{
fwrite(PB[i].N, sizeof(char), 1, fp);
fwrite(PB[i].Family, sizeof(char), 1, fp);
fwrite(PB[i].Name, sizeof(char), 1, fp);
fwrite(PB[i].Patronymic, sizeof(char), 1, fp);
fwrite(PB[i].Phone.Home, sizeof(char), 1, fp);
fwrite(PB[i].Phone.Work, sizeof(char), 1, fp);
fwrite(PB[i].Phone.Mobile, sizeof(char), 1, fp);
fwrite(PB[i].Address.Country, sizeof(char), 1, fp);
fwrite(PB[i].Address.City, sizeof(char), 1, fp);
fwrite(PB[i].Address.Street, sizeof(char), 1, fp);
fwrite(PB[i].Address.N_Home, sizeof(char), 1, fp);
fwrite(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
fwrite(PB[i].Email, sizeof(char), 1, fp);
}
fclose(fp);
}
void Load()
{
FILE *fp;
int i;
fp = fopen(FileName,"r");
for (i = 0; i < COUNT; i++)
{
fread(PB[i].N, sizeof(char), 1, fp);
fread(PB[i].Family, sizeof(char), 1, fp);
fread(PB[i].Name, sizeof(char), 1, fp);
fread(PB[i].Patronymic, sizeof(char), 1, fp);
fread(PB[i].Phone.Home, sizeof(char), 1, fp);
fread(PB[i].Phone.Work, sizeof(char), 1, fp);
fread(PB[i].Phone.Mobile, sizeof(char), 1, fp);
fread(PB[i].Address.Country, sizeof(char), 1, fp);
fread(PB[i].Address.City, sizeof(char), 1, fp);
fread(PB[i].Address.Street, sizeof(char), 1, fp);
fread(PB[i].Address.N_Home, sizeof(char), 1, fp);
fread(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
fread(PB[i].Email, sizeof(char), 1, fp);
}
fclose(fp);
}
Объяснение кода листинга программы
В данном коде реализована работа с телефонным справочником, который включает в себя массив структур PhoneBook. Каждая структура содержит информацию о контакте, включая поля: имя, фамилия, отчество, домашний телефон, рабочий телефон, мобильный телефон, информация о месте жительства (страна, город, улица, номер дома, номер квартиры) и адрес электронной почты.
В функции Save() происходит запись данных из массива структур PhoneBook в файл PhoneBook.txt. Функция открывает файл для записи (режим w), а затем в цикле записывает в файл каждый элемент массива, используя функцию fwrite().
Функция Load() выполняет обратную операцию - чтение данных из файла PhoneBook.txt в массив структур PhoneBook. Функция открывает файл для чтения (режим r), а затем в цикле считывает из файла каждый элемент массива, используя функцию fread().
Обратите внимание, что код предполагает, что при чтении файла все данные будут успешно считаны. Если в процессе чтения возникнет ошибка (например, файл был поврежден или недостаточно памяти для считывания данных), код может работать некорректно.