Узнать размер строки в файле - 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; }
Объяснение кода листинга программы
- Включаем заголовочный файл glib.h, который содержит функции и структуры для работы с памятью, массивами и строками в языке C.
- Инициализируем переменную main() с аргументами командной строки.
- Проверяем корректность ввода. Если аргументов ввода нет или их меньше двух, выводим сообщение об ошибке и завершаем программу.
- Создаем GIOChannel для чтения файла. Если файл не может быть открыт, выводим сообщение об ошибке и завершаем программу.
- Инициализируем GList для хранения строк из файла.
- Инициализируем GString для хранения текущей строки.
- Читаем файл построчно. Пока функция g_io_channel_read_line_string() возвращает G_IO_STATUS_NORMAL, считываем строку и добавляем ее в GList.
- Закрываем GIOChannel.
- Переворачиваем GList, чтобы строки выводились в обратном порядке.
- Выводим каждую строку на экран с помощью функции g_print().
- Очищаем каждую строку с помощью функции g_free().
- Освобождаем память, выделенную под GList.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д