Узнать размер строки в файле - 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, чтобы указать, что программа успешно завершилась.