Вопрос по сортировке строк в файле

  • Автор темы pharrell
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

pharrell

Гость
#1
Программа должна считыватьстроки из файла, отсортировать их и записать в этот же файл.Но почему то программа последнюю строчку копирует и получается,что в тексте две одинаковые строчки.Подскажи те пожалуйста если где есть ошибка.Заранее спасибо
Код:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<string.h>
#include<iostream.h>

#define maxline 1000
void sort(char* ptr[],int n_lines)
{
int i,j;
char *tmp;
for(i=0;i<n_lines-1;i++)

for(j=0;j<n_lines-1;j++)

if(strcmp(ptr[j],ptr[j+1])>0)
{
tmp=ptr[j];
ptr[j]=ptr[j+1];
ptr[j+1]=tmp;
}


}
void write_lines(char* ptr[],int n_lines)
{
int i;
char str[100];
for(i=0;i<n_lines;i++)
{
CharToOem(ptr[i],str);
cout<<str<<endl;
}
}
void main(void)
{
FILE *in;
char str[100];
int i;
int counter=0;
char buf[maxline];
char *ptr[maxline];

if((in=fopen("C:\\in.txt","rt"))==NULL)
{
cout<<"Error open file";
return;
}
for(counter=0;(!feof(in))&&counter<maxline;counter++)
{
fgets(buf,maxline,in);
if(buf[strlen(buf)-1]=='\n')
{
buf[strlen(buf)-1]='\0';
}
ptr[counter] = new char[strlen(buf)+1];
strcpy(ptr[counter],buf);
}
fclose(in);
cout<<"strok--->>"<<i<<endl;
cout<<"No sort:"<<endl;
write_lines(ptr,counter);
cout<<endl<<endl<<"Sort:"<<endl;
sort(ptr,counter);
write_lines(ptr,counter);

}
 
D

Dest!n

Гость
#2
Я проверил на VS2005 и ошибок не нашел, кроме

fclose(in);
// cout<<"strok--->>"<<i<<endl; // используется неинициализированная переменная i; наверное, имелось в виду
cout<<"strok--->>"<< counter <<endl;
 
Z

zubr

Гость
#3
А как же ты хотел, если у тебя i<n_lines-1 - последнюю строку ты не учитываешь.
 
D

Dest!n

Гость
#4
Ага, я нашел неточность. У тебя в файле последняя строка пустая. Если убрать последний перенос строки в текстовом файле - все будет работать. Но это, конечно, не выход. Лучше в скрипте добавить всего одну строку:
...
strcpy(ptr[counter],buf);
buf[0]='\0';
...
 
P

pharrell

Гость
#5
Как отсортировать,не создавуая массив указателей так сказать сортировка в файле??
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#6
А зачем? Для не большим файлов, размер которых позволят целиком отобразить их в памать, это оптимальным подход.

Для большим файлов в общем случае использует что нибудь вроде поэтапной сортировки(сортировки частями с последующим слиянием), например "многофазная сортировка слиянием".
 
P

Provisor

Гость
#7
Не забываем освобождать память :D
Код:
for(int j=0;j<counter;j++)
delete []ptr[j];
 
Статус
Закрыто для дальнейших ответов.