Вывести на экран последние 10 строк файла - C (СИ)
Формулировка задачи:
Условие: вывести на экран последние 10 строк файла (с сохранением порядка).
Примерный код:
Получается так, что кол-во строк никак не привязано к самому файлу и вывести нужное кол-во не удаётся.
Сам вопрос: как это привязать к файлу, или как удалить лишнее?
#include <stdio.h> #include <stdlib.h> int main () { FILE *f; int lines = 0; if ((f=fopen("test.dat", "r"))==NULL) { printf("Не удаётся открыть файл.\n"); return 0; } while(!feof(f)) { if (fgetc(f) == '\n') lines++; } lines++; //Тут огромный пробел fclose(f); return 0; }
Решение задачи: «Вывести на экран последние 10 строк файла»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #define STRING_LEN (1024) #define NUM_STRINGS (10) #define FILE_NAME "file.txt" int main(void) { FILE * fin; char * strings[NUM_STRINGS]; int first, last; for ( first = 0; first < NUM_STRINGS; ++first ) { if ( ! ( strings[first] = calloc(STRING_LEN, sizeof(char)) ) ) { perror("malloc"); return 1; } } first = -1; last = 0; if ( ! ( fin = fopen(FILE_NAME, "r") ) ) { perror("fopen"); return 1; } while ( fgets(strings[last], STRING_LEN, fin) ) { if ( first == last ) ++first; if ( first >= NUM_STRINGS || first < 0 ) first = 0; if ( ++last >= NUM_STRINGS ) last = 0; } if ( fclose(fin) ) { perror("fclose"); return 1; } if ( first < 0 ) fprintf(stderr, "Empty input file!\n"); else { printf("Last %d (if any) strings:\n", NUM_STRINGS); while ( *(strings[first]) ) { printf("%s", strings[first]); *(strings[first]) = '\0'; if ( ++first >= NUM_STRINGS ) first = 0; } } for ( first = 0; first < NUM_STRINGS; ++first ) free(strings[first]); return 0; }
Объяснение кода листинга программы
В данном коде происходит следующее:
- Включаются необходимые заголовочные файлы:
stdio.h
содержит функции для ввода и вывода данных в консоль.stdlib.h
содержит функции для работы с памятью.string.h
содержит функции для работы со строками.
- Определяются константы:
STRING_LEN
- максимальная длина строки в файле.NUM_STRINGS
- количество строк, которые необходимо считать из файла.FILE_NAME
- имя файла, из которого необходимо считать строки.
- Создаются переменные:
fin
- указатель на файл, из которого будет происходить чтение.strings[NUM_STRINGS]
- массив указателей на строки.first
иlast
- индексы, используемые для отслеживания положения в массиве.
- Выделяется память под строки:
- Используется функция
calloc()
для выделения памяти под каждую строку. Если память не может быть выделена, программа выводит сообщение об ошибке и завершает свое выполнение.
- Используется функция
- Начальные индексы устанавливаются в начало цикла:
first
устанавливается в 0.last
устанавливается в 0.
- Открывается файл для чтения:
- Используется функция
fopen()
для открытия файла. Если файл не может быть открыт, программа выводит сообщение об ошибке и завершает свое выполнение.
- Используется функция
- Происходит чтение строк из файла:
- Используется функция
fgets()
для чтения строки. - Если строка прочитана, она сохраняется в соответствующем элементе массива
strings
. - Если
first
иlast
выходят за пределы допустимых значений, они сбрасываются обратно в начало цикла.
- Используется функция
- Закрывается файл:
- Используется функция
fclose()
для закрытия файла. Если при закрытии файла возникает ошибка, программа выводит сообщение об ошибке и завершает свое выполнение.
- Используется функция
- Проверяется, пуст ли файл:
- Если
first
отрицательное число, выводится сообщение об ошибке.
- Если
- Выводятся последние строки из файла:
- Используется цикл
while
для вывода каждой строки. - Каждая строка выводится с помощью функции
printf()
. - После вывода каждой строки, ее память освобождается с помощью функции
free()
.
- Используется цикл
- Освобождается память под строки:
- Используется цикл
for
для освобождения памяти под каждую строку.
- Используется цикл
- Возвращается значение 0:
- Программа успешно завершила свое выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д