Не работает сортировка строки файла - C (СИ)
Формулировка задачи:
Здравствуйте! Программа сортирует строки,взятые из файла, и выводит отсортированную запись на экран. Размер файла неизвестен.Память выделять динамически.
Подскажите пожалуйста,почему не работает программа,где ошибки в коде?И на что лучше заменить строчки 42-45, чтобы было "красивее"?
Заранее спасибо!
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubble_sort(char *array[], int size)
{
char *temp; int i,j;
for(i=0;i-size;i++)
for(j=0;j-size;j++)
if(strcmp(array[ i ],array[j]) < 0)
temp=array[ i ],
array[ i ]=array[j],
array[j]=temp;
}
int main(void)
{
char *m,**v,t=0,c;
int j,k=0,l;
FILE* fin;
fin=fopen("Input.txt","rb");
if(fin==NULL)
fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
fseek(fin,0,SEEK_END);
int fsize=ftell(fin); // кол-во симв. в файле
fseek(fin,0,SEEK_SET);
fclose (fin);
m=(char*)malloc(fsize+1); // под терминирующий ноль 1
if (!(m=(char*)malloc(fsize+1)))
{
fprintf(stderr,"osibka raspredeleniya pamyati!\n");
}
fin=fopen("Input.txt", "rb");
if(fin==NULL)
fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
for(j=0;j < fsize;m[j++]=fgetc(fin)); //массив символов
fclose(fin);
while (!feof(fin))
if((c=fgetc(fin)) =='\n' || c==EOF)
k++;
v=(char**)malloc( sizeof(*v) * k);
for(v[0]=&m[0],m[fsize-3]=0,l=j=1;l-k;j++)
if(m[j]==13)
m[j]=0,
v[l++]=&m[j+2];
bubble_sort(v, k);
for(j=0;j<k;j++)
printf("%s\n",v[j]);
free(m);
free(v);
return 0;
}Решение задачи: «Не работает сортировка строки файла»
textual
Листинг программы
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubble_sort(char *array[], int size)
{
char *temp; int i, j;
for(i = 0; i < size; i++)
for(j = 0; j < size; j++)
if(strcmp(array[i], array[j]) < 0)
temp = array[i], array[i] = array[j], array[j] = temp;
}
int main(void)
{
char *m, **v, t = 0, c;
int j, i, k = 0, l;
FILE* fin;
fin = fopen("Input.txt", "rb");
if(fin == NULL)
fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
fseek(fin, 0, SEEK_END);
int fsize = ftell(fin); // кол-во симв. в файле
fseek(fin, 0, SEEK_SET);
if (!(m = (char*)malloc(fsize)))
{
fprintf(stderr,"osibka raspredeleniya pamyati!\n");
}
for(j = 0, i = 0; j < fsize + 1; j++, i++) //массив символов
{
c = fgetc(fin);
if (c == '\r') {i--; continue;}
if (c == '\n' || c == EOF)
{
k++;
m[i] = '\0';
continue;
}
if (c == EOF) break;
m[i] = c;
}
v = (char**)malloc(sizeof(*v) * k);
for(v[0] = &m[0], l = j = 1; l - k; j++)
{
if(m[j] == '\0')
{
v[l++] = &m[j + 1];
}
}
bubble_sort(v, k);
for(j = 0; j < k; j++)
printf("%s\n", v[j]);
free(m);
free(v);
fclose(fin);
getchar();
return 0;
}
Объяснение кода листинга программы
Код выполняет сортировку строк из файла по алфавиту
- В функции
mainоткрывается файлInput.txtдля чтения. - Определяется размер файла в байтах с помощью
fseekиftell. - Выделяется память под строку символов
mс помощьюmalloc. - В цикле
forпроисходит чтение символов из файла и запись их вm. - Строка
mразделяется на строки с помощьюmallocиfree. - В цикле
forпроисходит сортировка массива строкvс помощью функцииbubble_sort. - В цикле
forпроисходит вывод отсортированных строк на экран. - Выделяемая память освобождается с помощью
free. - Файл закрывается с помощью
fclose. - Программа завершается с помощью
getcharиreturn 0. Ошибка в коде заключается в неправильном выводе отсортированных строк. В условии циклаforперед операторомprintfошибочно указаноl - k, вместоj. Правильный вариант будетj < k, так как индексы в C начинаются с 0.