Скопировать строки из одного файла в другой в обратном порядке - 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);
}
Объяснение кода листинга программы
- Структура данных, используемая в коде, это связанный список (linked list) с помощью структуры
row_t. - Функция
pushдобавляет новую строку в начало списка. - Функция
popудаляет и возвращает последнюю добавленную строку из списка. - В функции
mainоткрывается файлIN_FILE_NAMEдля чтения и файлOUT_FILE_NAMEдля записи. - Затем строки из
IN_FILE_NAMEдобавляются в список с помощью функцииpush, пока не достигнут конец файла или не закончится память. - После чтения файла
IN_FILE_NAME, список содержит строки в обратном порядке. - Затем строки из списка (в обратном порядке) записываются в
OUT_FILE_NAMEс помощью функцииfputs. - Наконец, файлы закрываются, и выводится сообщение об успешном выполнении.