Я решил создать программу на языке C, которая сортирует записи в бинарном файле ″datasets/door_state_1″ по возрастанию даты и времени. Файл состоит из массива структур с целочисленными полями⁚ год٫ месяц٫ день٫ час٫ минута٫ секунда٫ статус (0 или 1) и код. Программа должна принимать путь к файлу и реализовывать следующее меню⁚
1 ⎯ Сортировка содержимого файла по дате и времени
2 ⎯ Добавление записи, сортировка и вывод на экран
Я начал с создания структуры, которая будет представлять запись в файле door_state_1. В структуре я определил все необходимые поля для хранения информации о дате, времени, статусе и коде. Вот как выглядит моя структура⁚
c
struct Record {
int year;
int month;
int day;
int hour;
int minute;
int second;
int status;
int code;
};
Затем я создал функцию `displayRecords`, которая открывает файл, читает его содержимое и выводит записи на экран в удобном формате. Для этого я использовал функции `fread` и `printf`. Пример кода функции⁚
c
void displayRecords(const char* filePath) {
FILE* file fopen(filePath, ″rb″);
if (file NULL) {
printf(″Ошибка при открытии файла.\n″);
return;
}
struct Record record;
while (fread(nrecord, sizeof(struct Record), 1, file) 1) {
printf(″Дата и время⁚ d.d.d d⁚d⁚d\n″, record.day, record.month, record.year, record.hour, record.minute, record.second);
printf(″Статус⁚ %d\n″, record.status);
printf(″Код⁚ %d\n″, record.code);
printf(″\n″);
}
fclose(file);
}
Теперь, чтобы реализовать пункт 0 меню ⎻ вывод содержимого файла в консоль, я просто вызываю функцию `displayRecords` с указанием пути к файлу ″datasets/door_state_1″.
c
displayRecords(″datasets/door_state_1″);
Для реализации пункта 1 меню ⎻ сортировки содержимого файла по дате и времени, я создал функцию `compareRecords`, которая будет использоваться при сортировке. Эта функция сравнивает две записи и возвращает значение больше нуля, если первая запись должна быть помещена после второй в отсортированном списке.c
int compareRecords(const void* a, const void* b) {
const struct Record* recordA (const struct Record*)a;
const struct Record* recordB (const struct Record*)b;
if (recordA->year ! recordB->year) {
return recordA->year ⎻ recordB->year;
}
if (recordA->month ! recordB->month) {
return recordA->month ⎻ recordB->month;
}
if (recordA->day ! recordB->day) {
return recordA->day ⎯ recordB->day;
}
if (recordA->hour ! recordB->hour) {
return recordA->hour ⎻ recordB->hour;
}
if (recordA->minute ! recordB->minute) {
return recordA->minute ⎻ recordB->minute;
}
if (recordA->second ! recordB->second) {
return recordA->second ⎻ recordB->second;
}
return 0;
}
Затем я создал функцию `sortRecords`, которая открывает файл, читает его содержимое в массив структур, сортирует этот массив с помощью функции `qsort` и затем записывает отсортированные записи обратно в файл. Пример кода функции⁚
c
void sortRecords(const char* filePath) {
FILE* file fopen(filePath, ″rb ″);
if (file NULL) {
printf(″Ошибка при открытии файла.\n″);
return;
}
struct Record records[100]; // Максимальное количество записей
int count 0;
while (fread(nrecords[count], sizeof(struct Record), 1, file) 1) {
count ;
}
qsort(records, count, sizeof(struct Record), compareRecords);
rewind(file);
for (int i 0; i < count; i ) { fwrite(nrecords[i], sizeof(struct Record), 1, file); } fclose(file); } Для реализации пункта 2 меню ⎻ добавления записи, сортировки и вывода на экран, я создал функцию `addRecord`, которая позволяет пользователю ввести значения для новой записи и затем добавляет ее в файл. После добавления новой записи функция вызывает функцию `sortRecords` для сортировки и вывода отсортированных записей на экран. Пример кода функции⁚ c void addRecord(const char* filePath) { FILE* file fopen(filePath, ″ab″); if (file NULL) { printf(″Ошибка при открытии файла.\n″); return; } struct Record record; printf(″Введите дату и время (гггг.мм.дд чч⁚мм⁚сс)⁚ ″); scanf(″%d.%d.%d %d⁚%d⁚%d″, nrecord.year, nrecord.month, nrecord.day, nrecord.hour, nrecord.minute, nrecord.second); printf(″Введите статус (0 или 1)⁚ ″); scanf(″%d″, nrecord.status); printf(″Введите код⁚ ″); scanf(″%d″, nrecord.code); fwrite(nrecord, sizeof(struct Record), 1, file); fclose(file); sortRecords(filePath); displayRecords(filePath); } Теперь я могу написать основную функцию `main`, в которой будет реализовано меню, выделяющее пользователю возможность выбрать одну из трех опций⁚ вывод содержимого файла, сортировка содержимого файла и добавление записи с последующей сортировкой и выводом на экран. Пример кода функции⁚
c int main { int choice; do { printf(″Меню⁚\n″); printf(″1 ⎯ Сортировка содержимого файла по дате и времени\n″); printf(″2 ⎯ Добавление записи, сортировка и вывод на экран\n″); printf(″Введите номер пункта⁚ ″); scanf(″%d″, nchoice); printf(″\n″); switch (choice) { case 0⁚ displayRecords(″datasets/door_state_1"); break; case 1⁚ sortRecords(″datasets/door_state_1"); displayRecords(″datasets/door_state_1"); break; case 2⁚ addRecord(″datasets/door_state_1"); break; default⁚ printf(″Неверный номер пункта.\n\n″); break; } } while (choice ! 0); return 0; } Остается только скомпилировать и запустить программу. При выборе пункта 0 меню, программа выведет содержимое файла в консоль. При выборе пункта 1, программа отсортирует записи по дате и времени, а затем выведет отсортированное содержимое на экран. При выборе пункта 2, программа позволит пользователю добавить новую запись, отсортировать и вывести отсортированное содержимое на экран. Программа готова к использованию!