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

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

  1. Включаются необходимые заголовочные файлы: stdio.h и glib.h.
  2. Определяются функции сравнения и обработки данных: cmp_func, print_func и free_func.
  3. В функции main проверяется корректность передачи аргументов в программу.
  4. Открывается файл для чтения с помощью g_io_channel_new_file.
  5. Создается дерево g_tree_new с функцией сравнения cmp_func.
  6. В цикле считывается каждая строка файла с помощью g_io_channel_read_line.
  7. Из каждой строки извлекается число (оценка) с помощью sscanf.
  8. Если число извлечено успешно, оно вставляется в дерево с помощью g_tree_insert.
  9. Каждое значение из дерева выводится с помощью функции print_func.
  10. После окончания работы со всеми элементами дерева, они освобождаются с помощью функции free_func.
  11. Дерево и канал ввода закрываются.
  12. Если при закрытии канала ввода возникают ошибки, выводится сообщение об ошибке.
  13. Программа возвращает 0 в случае успешного выполнения всех операций.

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


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

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

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