Работа программы проверена на файле размером 215 463 байт, содержащем 2805 строк, в каждой – около 80 символов. В ходе работы программы произведено 2651 чтений из файла, обнаружено 490 неповторяющихся терминов в 218 абзацах.
Вывод:
Данный алгоритм работы с текстовым файлом применим для файлов больших размеров и способен за небольшой временной интервал произвести выемку нужных слов с их последующей сортировкой, а также записью в выходной файл.
Приложение: текст программы с комментариями.
#include "stdafx.h"
#include "stdio.h"
#include "fstream.h"
#include "iostream.h"
#include "conio.h"
#include "malloc.h"
#include "string.h"
#include "fcntl.h"
#include "io.h"
struct termin
{public:
char *n; //Само слово
int abc; //Номер абзаца
termin(){n="";abc=0;};
~termin(){n="";abc=0;};
void extend(int web)
{ a=(termin*)realloc(a,(web+1)*sizeof(termin)); }
void sort(int);//Сортировка
void to_file();//Запись в файл
int prov_mid_word(char*,int, FILE);
int prov_mid_abc(char*);
bool term_here(int, char*);
int work_with_file();
//}
}*a;
void sort(int kol) //Сортировка
{int r=0;char q;
termin w;
printf("Vid sortirovki\n");
printf("1. Vozrastanie\n");
printf("2. Ubyvanie\n");
q=getch(); //Выбор способа сортировки
while(r<=kol)
{
for(int i=r+1;i<=kol;i++)
if ((strcmp(a[r].n,a[i].n)>0 && q=='1')||
(strcmp(a[r].n,a[i].n) <0 && q=='2'))
{
w=a[r];
a[r]=a[i];
a[i]=w; //Метод "трех стаканов"
}
r++;
};
};
void to_file(int kol) //Запись в выходной файл
{
int r=0;
FILE *fp1;
fp1=fopen("exit.txt","w");
while(r<=kol)
{
fwrite(a[r].n,strlen(a[r].n),1,fp1);// Записать термин
fseek(fp1,-strlen(a[r].n)+20,SEEK_CUR); //Чтобы номера стояли вне зависимости от длины термина одним столбиком
fprintf(fp1," %d",a[r].abc);// Запись номера абзаца
fwrite("\n",1,1,fp1);// Позиционирование на следующей строке в файле
r++;
}
}
int prov_mid_abc(char* s) //Если влезли в середину трех проблов
{if(s[80]==' ' && s[79]==' '&& s[78]!=' ') return 1;//Если в конце два пробелов - новый абзац
if(s[0]==' ' && s[1]==' ' && s[2]!=' ') return 1;//Если в начале два пробелов - новый абзац
return 0;
}
int prov_mid_word(char s[80],int si, FILE *fp)//Проверка, что при считывании не залезли в середину термина
{int y;
si--; //Уменьшить длину буфера
if((s[si]>-129)&&(s[si]<-96)) //Если последний символ строки оказались частью термина
{ for(y=0;y<=si;y++) s[y]='+'; //Затереть строку
fseek(fp,-si,SEEK_CUR); //Спозиционироваться назад
fread(s,si,1,fp); //Заново считать строку
prov_mid_word(s,si,fp);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.