Форматирование текстового файла Применение алгоритма работы с текстовыми файлами больших размеров, страница 4

Работа программы проверена на файле размером 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);