Я должен сделать алгоритм RLE в C с экранирующий символ (Q)RLE алгоритм сжатия с
Например, если я иметь вход как: AAAAAAABBBCCCDDDDDDEFG
Выходной сигнал должен быть: QA7BBBCCCQD6FFG
это код, который я сделал:
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *source = fopen("Test.txt", "r");
FILE *destination = fopen("Dest.txt", "w");
char carCorrente; //in english: currentChar
char carSucc; // in english: nextChar
int count = 1;
while(fread(&carCorrente, sizeof(char),1, source) != 0) {
if (fread(&carCorrente, sizeof(char),1, source) == 0){
if(count<=3){
for(int i=0;i<count;i++){
fprintf(destination,"%c",carCorrente);
}
}
else {
fwrite("Q",sizeof(char),1,destination);
fprintf(destination,"%c",carCorrente);
fprintf(destination,"%d",count);
}
break;
}
else fseek(source,-1*sizeof(char), SEEK_CUR);
while (fread(&carSucc, sizeof(char), 1, source) != 0) {
if (carCorrente == carSucc) {
count++;
}
else {
if(count<=3){
for(int i=0;i<count;i++){
fprintf(destination,"%c",carCorrente);
}
}
else {
fwrite("Q",sizeof(char),1,destination);
fprintf(destination,"%c",carCorrente);
fprintf(destination,"%d",count);
}
count = 1;
goto OUT;
}
}
OUT:fseek(source,-1*sizeof(char), SEEK_CUR); //exit 2° while
}
}
проблема, когда у меня есть вклад, как это: ABBBCCCDDDDDEFGD
в этом случае выход есть: QB4CCCQD5FFDD
и я не знаю почему :(
Вы знаете, что 'fread' и другие функции чтения файлов заранее позицию чтения в файле, не так ли? Поэтому, когда вы просто проверяете 0, не сохраняя результат, A получает едят. Кроме того, рассмотрите возможность использования 'c = getc (f)' вместо 'fread', что лучше подходит для более длинных блоков данных. –
да, я знаю по этой причине:
fseek (источник, -1 * sizeof (char), SEEK_CUR); –
если я использую getc, как я могу вернуться с указателем в файл? –