Вывести на экран последние 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:
- Программа успешно завершила свое выполнение.