我必須做RLE算法在C與轉義字符(Q)RLE壓縮算法的c
例如,如果我有等的輸入: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(source,-1 * sizeof(char),SEEK_CUR); –
如果我使用getc我怎麼能回到文件中的指針? –