НАВИГАЦИЯ
   Главная
  Программы для ПК [36]
  Программы для ПК-2 [3]
  Скрипты для WEB [8]
  Исходники на C, VC++, С++ Builder [12]
  Исходники на Basic [2]
  Исходники на Pascal [2]
  Исходники для микроконтроллеров [5]
  Электроника для дома [34]
  Электроника для аквариума [1]
  Электроника для автомобиля [11]
  Справочник [4]
  Разное [7]
  Проект "Умный дом"
  Файлы, библиотеки

  FAQ
  Рассылка новостей сайта

  Ссылки
  Сообщение автору

 
 
 
  Реальные знакомства по Украине, СНГ и за рубеж на любой вкус и цвет. Рассылка анкет. Помощь     Rambler's Top100  
Сортировка текстового файла простым разделением (по длине строк). Файл читается группами по n строк в динамический массив указателей на строки, группа сортируется и записывается в промежуточный файл. Имя промежуточного файла генерируется в виде Fnnnn.txt, где nnnn – номер группы. Затем файлы сливаются по “олимпийской” системе – по два файла в один., f_sort1
Просмотров: 1446Дата изменения: 18.03.2007г.


/*
Сортировка текстового файла простым разделением (по длине строк).
Файл читается группами по n строк в динамический массив указателей на строки,
группа сортируется и записывается в промежуточный файл.
Имя промежуточного файла генерируется в виде Fnnnn.txt, где nnnn – номер группы.
Затем файлы сливаются по “олимпийской” системе – по два файла в один.
*/
//---------------------------------------------------------------------------
#pragma hdrstop

#include <string.h>
#include <iostream>
using namespace std;

#define MAX_LEN_STR 1000  // максимальная длина буфера чтения
#define MAX_LEN_FILE 20  // максимальная длина имени файла
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
  int kol;  // кол-во строк
  FILE *f,*fo; int k, n, i, j, l, lm;
  char *buf, *fname, *buf2;

  if(argc!=3) {
    cout << "Zapusk: f_sort1.exe ImjaFaila Strok" << endl; cin.get(); return -1;
  }
  kol = atoi(argv[2]);
  if(kol<1){
    cout << "Oshibka kolichestva strok \"" << argv[2] << "\"" << endl; cin.get(); return -1;
  }
  if((f=fopen(argv[1],"r"))==NULL){
    cout << "Oshibka otkrytija faila \"" << argv[1] << "\"" << endl; cin.get(); return -1;
  }
  buf   = new char[MAX_LEN_STR];
  fname = new char[MAX_LEN_FILE];
  char **M = new char*[kol];

  for(n=0;!feof(f);n++){
    sprintf(fname,"F%d.txt",n);
    if((fo=fopen(fname,"w"))==NULL){
      cout << "Oshibka sozdanija faila \"" << fname << "\"" << endl; break;
    }
    for(k=0; k<kol; k++){ // читаем в массив
      if(fgets(buf,MAX_LEN_STR,f)==NULL) break; // считали в буфер
      M[k] = new char[strlen(buf)+1]; // выделили память под новую строку
      strcpy(M[k],buf); // скопировали из буфера строку
      cout << M[k]; // выводим что считали из файла
    }
    if(k>0){
      for(i=1; i < k; i++) {  //сортируем массив "Пузырьковым методом"
        for(j=k-1; j>=i; j--) {
          if(strlen(M[j-1]) > strlen(M[j]) ) {
            buf2 = M[j-1]; M[j-1] = M[j]; M[j] = buf2;
          }
        }
      }
      for(i=0; i<k; i++) fputs(M[i], fo);  // пишем в файл
      for(i=0; i<k; i++) delete []M[i]; //удаляем строки
    }
    fclose(fo);
  }
  if(n>1){ // Сливаем файлы по два
    for(i=0; i<n; i+=2){
      sprintf(fname,"F%d_%d.txt",i,i+1);
      if((fo=fopen(fname,"w"))==NULL){
        cout << "Oshibka sozdanija faila \"" << fname << "\"" << endl; break;
      }
      sprintf(fname,"F%d.txt",i);
      if((f=fopen(fname,"r"))!=NULL){ // читаем из первого файла
        while(!feof(f)){
          if(fgets(buf,MAX_LEN_STR,f)==NULL) break; // считали в буфер
          fputs(buf, fo);  // пишем в файл
        }
        fclose(f);
//        remove(fname); // удалим файл
      }
      sprintf(fname,"F%d.txt",i+1);
      if((f=fopen(fname,"r"))!=NULL){ // читаем из второго файла
        while(!feof(f)){
          if(fgets(buf,MAX_LEN_STR,f)==NULL) break; // считали в буфер
          fputs(buf, fo);  // пишем в файл
        }
        fclose(f);
//        remove(fname); // удалим файл
      }
      fclose(fo);
    }
  }

  delete []M;
  fclose(f);
  delete []buf;
  delete []fname;
  cout << "Nazmite na ENTER" << endl;
  cin.get(); cin.get();
  return 0;
}
//---------------------------------------------------------------------------

 


Подпишитесь на рассылку новостей сайта!
Использование материалов возможно только при разрешении автора и с обязательным указанием ссылки на сайт vovka.sv19.com
Programmed by Vladimir Sharapov © 2004-2017 http://vovka.sv19.com