Не работает сортировка строки файла - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д