Скопировать строки из одного файла в другой в обратном порядке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Необходимо написать программу ,копирующую строки из одного файла в другой в обратном порядке. Буду благодарен за помощь

Решение задачи: «Скопировать строки из одного файла в другой в обратном порядке»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct ROW {
    char * str;
    struct ROW * next;
} row_t;
 
row_t * push(row_t * top, const char * str){
    row_t * row;
    
    if ( ( row = malloc(sizeof(row_t)) ) == NULL ){
        perror("malloc");
        return NULL;
    }
    if ( ( row->str = strdup(str) ) == NULL ){
        perror("strdup");
        return NULL;
    }
    row->next = top;
    
    return row;
}
 
char * pop(row_t ** top, char * str){
    row_t * ret;
    
    if ( ! *top )
        return NULL;
    
    strcpy(str, (*top)->str);
    ret = (*top)->next;
    free((*top)->str);
    free(*top);
    *top = ret;
    
    return str;
}
 
#define IN_FILE_NAME "in.txt"
#define OUT_FILE_NAME "out.txt"
    
int main(void){
    FILE * f;
    char buf[BUFSIZ];
    row_t * stk;
    
    if ( ( f = fopen(IN_FILE_NAME, "r") ) == NULL ){
        fprintf(stderr, "Can't open file %s for input!\n", IN_FILE_NAME);
        exit(1);
    }
    
    for ( stk = NULL; fgets(buf, BUFSIZ, f) && ( stk = push(stk, buf) ); )
        ;
    if ( ! stk ){
        fprintf(stderr, "Memory error!\n");
        fclose(f);
        exit(1);
    }
    
    if ( ferror(f) ){
        fprintf(stderr, "Error while reading input file!\n");
        exit(1);
    }
    if ( fclose(f) ){
        perror("fclose");
        exit(1);
    }
    
    if ( ( f = fopen(OUT_FILE_NAME, "w") ) == NULL ){
        fprintf(stderr, "Can't open file %s for output!\n", OUT_FILE_NAME);
        exit(1);
    }
    
    while ( pop(&stk, buf) ){
        if ( fputs(buf, f) == EOF ){
            fprintf(stderr, "Error while writing to output file!\n");
            exit(1);
        }
    }
    
    if ( fclose(f) ){
        perror("fclose");
        exit(1);
    }
    
    fprintf(stderr, "Done.\n");
    exit(0);
}

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

  1. Структура данных, используемая в коде, это связанный список (linked list) с помощью структуры row_t.
  2. Функция push добавляет новую строку в начало списка.
  3. Функция pop удаляет и возвращает последнюю добавленную строку из списка.
  4. В функции main открывается файл IN_FILE_NAME для чтения и файл OUT_FILE_NAME для записи.
  5. Затем строки из IN_FILE_NAME добавляются в список с помощью функции push, пока не достигнут конец файла или не закончится память.
  6. После чтения файла IN_FILE_NAME, список содержит строки в обратном порядке.
  7. Затем строки из списка (в обратном порядке) записываются в OUT_FILE_NAME с помощью функции fputs.
  8. Наконец, файлы закрываются, и выводится сообщение об успешном выполнении.

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


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

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

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