Не выводит полностью текст
Задача: на диске есть исходные файлы in.txt и out.txt. Необходимо, чтобы программа выводила строки из файла in в файл out в обратном порядке, но она почему-то выводит только первую строку, остальные пустые. В чем проблема?
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int rev_read_char(FILE* stream, char* ch)
{
int read_res = fread(ch, sizeof(char), 1, stream);
fseek(stream, -2, SEEK_CUR);
return read_res;
}
long int find_prelast_carriage(FILE* stream)
{
fseek(stream, -2, SEEK_CUR);
char ch = 0;
while ( ch != '\n' )
{
rev_read_char(stream, &ch);
if (ftell(stream) == 0)
return 0;
}
fseek(stream, 1, SEEK_CUR);
return ftell(stream);
}
int foo(FILE* input, FILE* output)
{
fseek(input, 0, SEEK_END);
long int pos = 1;
char* string = (char*)malloc(sizeof(char) * 200);
while (pos != 0)
{
pos = find_prelast_carriage(input);
fgets(string, 200, input);
fputs(string, output);
fseek(input, pos, SEEK_SET);
}
}
void print_string(char* string) {
for (int i = 0; string[i]; i++) {
printf("%c", string[i]);
}
}
int main()
{
setlocale(LC_ALL, "Rus");
char* input_path = "D:/in.txt";
char* output_path = "D:/out.txt";
FILE* input = fopen(input_path, "r");
FILE* output = fopen(output_path, "w");
if (!input || !output)
{
printf_s("Ошибка\n");
return 0;
}
else
{
printf_s("Готово\n");
}
foo(input, output);
return 0;
}
Ответы (1 шт):
Автор решения: Sergey
→ Ссылка
У вас операция fseek() размазана по всей программе - она выполняется в rev_read_char, find_prelast_carriage и foo. Понять, к чему это приводит в итоге - невозможно!
Я бы решал эту задачу гораздо проще - сделал бы программу с двумя проходами:
- Просматриваем входной файл в прямом направлении и запоминаем положение всех символов '\n'
- Запомненные смещения в файле просматриваем в обратном порядке и читаем сразу всю строку, расположенную между двумя символами '\n'
Кстати такое решение и работать будет гораздо быстрее решения "в лоб" за счёт многократно меньшего обращения к функциям ОС.