Сортировка структуры из текстового файла. Borland C для DOS. - C (СИ)
Формулировка задачи:
Помогите пожалуйста с решением задачи: необходимо создать структуру, записать ее в текстовый файл, а затем считать эти данные и отсортировать их по названию города (location), а также, по количеству дней (duration). С возможностью реализации на Borland C для DOS. Заранее спасибо.
Ниже указываю текст программы с реализованными частями задачи: объявление структуры, введение данных в текстовый файл, считывание данных из текстового файла и выведение их на экран.
Вот содержимое файла base.txt:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
//объявление структуры
struct bureau
{
char country[15],location[15],type[10];
int duration;
};
bureau b;
//запись в текстовый файл
void input (FILE *in)
{int i=0;
in=fopen("base.txt","w");
do
{
printf("Country & Location ");
scanf("%s %s",b.country,b.location);
printf("Type & duration ");
scanf("%s %d",b.type, &b.duration);
fprintf(in,"%s %s %s %d\n",b.country,b.location,b.type,b.duration);
i++;
puts("To continue [y/n]?");
}
while (getch()!='n');
fcloseall();
}
//считывание из текстового файла
void output (FILE *in)
{
char c[80];
clrscr();
in=fopen("base.txt","r");
while(!feof(in))
{ fgets (c,80,in);
printf("%s \n",c);
}
fcloseall();
}
int main(void)
{FILE *in;
clrscr();
input(in);
clrscr();
output(in);
getch();
return 0;
}UK London Tour 5 Ukraine Lviv Tour 10 USA New-York Tour 3 Russia Moscow 8 USA Washington Tour 2
вверх
вверх
Решение задачи: «Сортировка структуры из текстового файла. Borland C для DOS.»
textual
Листинг программы
struct bureau arr[10];
int asize;
struct bureau b;
int retval;
asize = 0;
while(fgets(line, sizeof line, ifp) != NULL) {
retval = sscanf(line, "%s %s %s %d",
b.country, b.location,
b.type, &b.duration);
if (retval == 4 && asize < 10)
arr[asize++] = b;
else if (retval != 4) {
fprintf(stderr, "error: incorrect data\n");
break;
} else {
fprintf(stderr, "error: excess data\n");
break;
}
}
Объяснение кода листинга программы
- Объявляется структура bureau и массив arr из 10 элементов этой структуры.
- Инициализируются переменные asize, b, retval.
- Переменная asize инициализируется нулем.
- Цикл while считывает строки из файла, используя функцию fgets, пока не достигнет конца файла.
- Внутри цикла, каждая строка разбивается на поля, используя функцию sscanf.
- Если все четыре поля успешно считываются и индекс массива меньше 10, то структура добавляется в массив.
- Если данные некорректны (не удалось считать все четыре поля), выводится сообщение об ошибке и цикл прерывается.
- Если данных больше, чем нужно (считано больше четырех полей), выводится сообщение об ошибке и цикл прерывается.