Отсортировать содержимое файла по алфавиту - C (СИ)
Формулировка задачи:
Дали лабу,писать можно только на C. С ним не особо знаком. Вопрос такой. После чтения всех символов из файла, мне нужно отсортировать полученное по алфавиту. Пробую обычным пузырьком, но после него у меня компиль(Visual Studio 2017) ругается на free(text). Немного не понимаю, как я порчу кучу. Может я торможу, подскажите пожалуйста.
//19. Задан текстовый файл F1, состоящий из произвольной последовательности буквенных символов. Упорядочить символы в алфавитном порядке, при этом все повторяющиеся символы должны быть удалены, и переписать новый текст в файл F2.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
#include <malloc.h>
void bubble(char *i, int n);
void main(void)
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char *text = NULL;
int size = 0;
FILE *f;
f = fopen("F:\Input.txt", "r");
if (f != NULL)
{
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
text = (char*)malloc(size * sizeof(char));
fread(text, size, 1, f);
}
fclose(f);
bubble(text, strlen(text));
printf("%s", text);
f = fopen("F:\Output.txt", "w");
fwrite(text, 1, size, f);
free(text);
fclose(f);
_getch();
}
void bubble(char *i, int n)
{
int a, b;
char t;
for (a = 0; a < n; a++)
for (b = n - 1; b >= a; b--)
{
if (i[b - 1] > i[b])
{
t = i[b - 1];
i[b - 1] = i[b];
i[b] = t;
}
}
}Решение задачи: «Отсортировать содержимое файла по алфавиту»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
void bubble(char *i, int n);
int main(void)
{
char *text = NULL;
int size = 0;
FILE *f;
f = fopen("c:\\in.txt", "r");
if (f != NULL)
{
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
text = (char*)malloc(size * sizeof(char)+1);
fread(text, size, 1, f);
}
text[size-1]='\0';
fclose(f);
bubble(text, strlen(text));
printf("%s", text);
f = fopen("c:\\out.txt", "w");
fwrite(text, 1, size, f);
free(text);
fclose(f);
_getch();
}
void bubble(char *i, int n)
{
int a, b;
char t;
for (a = 0; a < n-1; a++)
for (b = n - 2; b >= a; b--)
{
if (i[b] > i[b+1])
{
t = i[b];
i[b] = i[b+1];
i[b+1] = t;
}
}
}
Объяснение кода листинга программы
В этом коде:
- В функции main() открывается файл
c:\\in.txtдля чтения и файлc:\\out.txtдля записи. - Считывается размер файла
c:\\in.txtс помощью функций fseek() и ftell(). - Массив символов text выделяется с помощью malloc() и заполняется содержимым файла с помощью fread().
- Добавляется нулевой символ в конец массива text.
- Вызывается функция bubble() для сортировки массива text по алфавиту.
- Содержимое массива text выводится на экран с помощью функции printf().
- Содержимое массива text записывается в файл
c:\\out.txtс помощью функции fwrite(). - Массив text освобождается с помощью функции free().
- Файл
c:\\out.txtзакрывается с помощью функции fclose(). - Подтверждается нажатием клавиши с помощью функции _getch(). В функции bubble() используется алгоритм сортировки пузырьком.