Отсортировать строки по алфавиту - C (СИ)
Формулировка задачи:
Здравствуйте!
Есть 2 файла.
Тоесть, первый программа берет 1 букву каждой строки и сортирует их по алфавиту.
Помогите написать.
Заранее благодарен.
input.txt:
Форум программистов и сисадминов
Привет всем
Как дела
Сегодня жарко
output.txt:
Как дела
Привет всем
Сегодня жарко
Форум программистов и сисадминов
Решение задачи: «Отсортировать строки по алфавиту»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#define _GNU_SOURCE
#define INPUT_FILE_NAME "input.txt"
#define OUTPUT_FILE_NAME "output.txt"
int asc_cmp(const void * a, const void * b) {
return wcscmp(*(wchar_t**)a, *(wchar_t**)b);
}
int main(void) {
wchar_t buf[BUFSIZ], ** strings;
size_t count, i;
FILE * f;
setlocale(LC_ALL, "ru_RU.utf8");
if ( ! ( f = fopen(INPUT_FILE_NAME, "r") ) ){
fprintf(stderr, "Can't open file %s for input!\n", INPUT_FILE_NAME);
exit(1);
}
for ( strings = NULL, count = 0; fgetws(buf, BUFSIZ, f); ++count ) {
if ( ! ( strings = realloc(strings, sizeof(wchar_t*) * (count + 1)) ) || ! ( strings[count] = wcsdup(buf) ) ) {
fprintf(stderr, "Memory error!\n");
if ( fclose(f) )
fprintf(stderr, "Can't properly close input file!\n");
exit(1);
}
}
if ( ferror(f) || fclose(f) ) {
fprintf(stderr, "Something is wrong with input file!\n");
exit(1);
}
if ( ! count ) {
fprintf(stderr, "Input file is empty!\n");
exit(1);
}
qsort(strings, count, sizeof(wchar_t*), asc_cmp);
if ( ! ( f = fopen(OUTPUT_FILE_NAME, "w") ) ) {
fprintf(stderr, "Can't open file %s for output!\n", OUTPUT_FILE_NAME);
exit(1);
}
for ( i = 0; i < count; ++i ) {
if ( fputws(strings[i], f) < 0 ) {
fprintf(stderr, "Can't write to output file!\n");
if ( fclose(f) )
fprintf(stderr, "can't properly close output file!\n");
exit(1);
}
}
for ( i = 0; i < count; ++i )
free(strings[i]);
free(strings);
if ( fclose(f) ) {
fprintf(stderr, "Can't properly close output file!\n");
exit(1);
}
fprintf(stderr, "Done.\n");
exit(0);
}
Объяснение кода листинга программы
Код открывает файл с входными данными, считывает строки из этого файла и сохраняет их в массиве строк. Затем он сортирует этот массив строк в алфавитном порядке с помощью функции qsort и функции сравнения asc_cmp. После этого код открывает файл для записи, записывает отсортированные строки в этот файл и закрывает его. Если при работе с файлами или памятью возникает ошибка, код выводит сообщение об ошибке и завершает работу с кодом 1. В конце код выводит сообщение Done и завершает работу с кодом 0.