Вывести на экран последние 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;
}

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

В данном коде происходит следующее:

  1. Включаются необходимые заголовочные файлы:
    • stdio.h содержит функции для ввода и вывода данных в консоль.
    • stdlib.h содержит функции для работы с памятью.
    • string.h содержит функции для работы со строками.
  2. Определяются константы:
    • STRING_LEN - максимальная длина строки в файле.
    • NUM_STRINGS - количество строк, которые необходимо считать из файла.
    • FILE_NAME - имя файла, из которого необходимо считать строки.
  3. Создаются переменные:
    • fin - указатель на файл, из которого будет происходить чтение.
    • strings[NUM_STRINGS] - массив указателей на строки.
    • first и last - индексы, используемые для отслеживания положения в массиве.
  4. Выделяется память под строки:
    • Используется функция calloc() для выделения памяти под каждую строку. Если память не может быть выделена, программа выводит сообщение об ошибке и завершает свое выполнение.
  5. Начальные индексы устанавливаются в начало цикла:
    • first устанавливается в 0.
    • last устанавливается в 0.
  6. Открывается файл для чтения:
    • Используется функция fopen() для открытия файла. Если файл не может быть открыт, программа выводит сообщение об ошибке и завершает свое выполнение.
  7. Происходит чтение строк из файла:
    • Используется функция fgets() для чтения строки.
    • Если строка прочитана, она сохраняется в соответствующем элементе массива strings.
    • Если first и last выходят за пределы допустимых значений, они сбрасываются обратно в начало цикла.
  8. Закрывается файл:
    • Используется функция fclose() для закрытия файла. Если при закрытии файла возникает ошибка, программа выводит сообщение об ошибке и завершает свое выполнение.
  9. Проверяется, пуст ли файл:
    • Если first отрицательное число, выводится сообщение об ошибке.
  10. Выводятся последние строки из файла:
    • Используется цикл while для вывода каждой строки.
    • Каждая строка выводится с помощью функции printf().
    • После вывода каждой строки, ее память освобождается с помощью функции free().
  11. Освобождается память под строки:
    • Используется цикл for для освобождения памяти под каждую строку.
  12. Возвращается значение 0:
    • Программа успешно завершила свое выполнение.

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


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

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

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