Узнать размер строки в файле - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Необходимо узнать размер строки в файле, чтобы выделить для нее память и занести в динамический массив. Проблема в том, что strlen не хочет работать с указателем на файл. Можно ли это как то реализовать не создавая большой статический массив? (иначе просто смысл в динамическом массиве пропадает)

Решение задачи: «Узнать размер строки в файле»

textual
Листинг программы
/* ANSI C 99 */
#include <glib.h>
 
int main(int argc, char ** argv) {
    if ( argc != 2 ) {
        g_print("Usage: %s <file_to_read>\n", *argv);
        return -1;
    }
    
    GError * err;
    GIOChannel * inpfile = g_io_channel_new_file(argv[1], "r", &err);
    if ( ! inpfile ) {
        g_print("%s\n", ( err ) ? err->message : "Can't open input file!");
        return 1;
    }
    
    GList * rows = NULL;
    GString * str = g_string_new("");
    
    while ( g_io_channel_read_line_string(inpfile, str, NULL, &err) == G_IO_STATUS_NORMAL )
        rows = g_list_prepend(rows, g_strdup(str->str));
    
    g_io_channel_close(inpfile);
    
    rows = g_list_reverse(rows);
    g_list_foreach(rows, (GFunc)g_print, NULL);
    
    g_list_foreach(rows, (GFunc)g_free, NULL);
    g_list_free(rows);
    
    return 0;
}

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

  1. Включаем заголовочный файл glib.h, который содержит функции и структуры для работы с памятью, массивами и строками в языке C.
  2. Инициализируем переменную main() с аргументами командной строки.
  3. Проверяем корректность ввода. Если аргументов ввода нет или их меньше двух, выводим сообщение об ошибке и завершаем программу.
  4. Создаем GIOChannel для чтения файла. Если файл не может быть открыт, выводим сообщение об ошибке и завершаем программу.
  5. Инициализируем GList для хранения строк из файла.
  6. Инициализируем GString для хранения текущей строки.
  7. Читаем файл построчно. Пока функция g_io_channel_read_line_string() возвращает G_IO_STATUS_NORMAL, считываем строку и добавляем ее в GList.
  8. Закрываем GIOChannel.
  9. Переворачиваем GList, чтобы строки выводились в обратном порядке.
  10. Выводим каждую строку на экран с помощью функции g_print().
  11. Очищаем каждую строку с помощью функции g_free().
  12. Освобождаем память, выделенную под GList.
  13. Возвращаем 0, чтобы указать, что программа успешно завершилась.

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


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

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

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