Сортировка строк в текстовом файле - C (СИ)
Формулировка задачи:
В файле в одной строке записаны две переменные: имя, баллы. Можно ли отсортировать строки по баллам (строка начинается с баллов) в порядке убывания?
Решение задачи: «Сортировка строк в текстовом файле»
textual
Листинг программы
#include <stdio.h> #include <glib.h> int cmp_func(gconstpointer a, gconstpointer b) { return GPOINTER_TO_INT(b) - GPOINTER_TO_INT(a); } gboolean print_func(gpointer key, gpointer value, gpointer data) { for ( GSList * iter = (GSList*)value; iter; iter = g_slist_next(iter) ) g_print("%s", (char*)(iter->data)); return FALSE; } gboolean free_func(gpointer key, gpointer value, gpointer data) { g_slist_free_full((GSList*)value, g_free); return FALSE; } int main(int argc, char ** argv) { if ( argc < 2 ) { g_message("USAGE: %s <file_name>\n", *argv); return 1; } GError * err = NULL; GIOChannel * inp = g_io_channel_new_file(argv[1], "r", &err); if ( ! inp ) { g_warning("%s: Can't open file %s for input - %s\n", argv[0], argv[1], ( err ) ? err->message : "unknown error"); return 1; } GTree * tree = g_tree_new(cmp_func); char * str; int line = 0; while ( g_io_channel_read_line(inp, &str, NULL, NULL, &err) == G_IO_STATUS_NORMAL ) { int score; line += 1; if ( sscanf(str, "%d", &score) != 1 ) { g_warning("%s: Can't read score in line #%d\n", *argv, line); g_free(str); continue; } g_tree_insert(tree, GINT_TO_POINTER(score), (gpointer)g_slist_prepend((GSList*)g_tree_lookup(tree, GINT_TO_POINTER(score)), (gpointer)str)); } if ( g_io_channel_shutdown(inp, FALSE, &err) != G_IO_STATUS_NORMAL ) g_warning("%s: Can't properly close input file!\n", *argv); g_tree_foreach(tree, print_func, NULL); g_tree_foreach(tree, free_func, NULL); g_tree_destroy(tree); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h и glib.h.
- Определяются функции сравнения и обработки данных: cmp_func, print_func и free_func.
- В функции main проверяется корректность передачи аргументов в программу.
- Открывается файл для чтения с помощью g_io_channel_new_file.
- Создается дерево g_tree_new с функцией сравнения cmp_func.
- В цикле считывается каждая строка файла с помощью g_io_channel_read_line.
- Из каждой строки извлекается число (оценка) с помощью sscanf.
- Если число извлечено успешно, оно вставляется в дерево с помощью g_tree_insert.
- Каждое значение из дерева выводится с помощью функции print_func.
- После окончания работы со всеми элементами дерева, они освобождаются с помощью функции free_func.
- Дерево и канал ввода закрываются.
- Если при закрытии канала ввода возникают ошибки, выводится сообщение об ошибке.
- Программа возвращает 0 в случае успешного выполнения всех операций.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д