Не работает сортировка строки файла - 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; 
 
}

Объяснение кода листинга программы

Код выполняет сортировку строк из файла по алфавиту

  1. В функции main открывается файл Input.txt для чтения.
  2. Определяется размер файла в байтах с помощью fseek и ftell.
  3. Выделяется память под строку символов m с помощью malloc.
  4. В цикле for происходит чтение символов из файла и запись их в m.
  5. Строка m разделяется на строки с помощью malloc и free.
  6. В цикле for происходит сортировка массива строк v с помощью функции bubble_sort.
  7. В цикле for происходит вывод отсортированных строк на экран.
  8. Выделяемая память освобождается с помощью free.
  9. Файл закрывается с помощью fclose.
  10. Программа завершается с помощью getchar и return 0. Ошибка в коде заключается в неправильном выводе отсортированных строк. В условии цикла for перед оператором printf ошибочно указано l - k, вместо j. Правильный вариант будет j < k, так как индексы в C начинаются с 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы