RLE COM pression算法的c [英] rle compression algorithm c

查看:142
本文介绍了RLE COM pression算法的c的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须做一个RLE算法的C与转义字符(Q)

I have to do a rle algorithm in c with the escape character (Q)

例如,如果我有一个像输入: AAAAAAABBBCCCDDDDDDEFG
输出必须是: QA7BBBCCCQD6FFG

example if i have an input like: AAAAAAABBBCCCDDDDDDEFG
the output have to be: QA7BBBCCCQD6FFG

这是在code,我做:

this is the code that i made:

#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
我不知道为什么:(

the problem is when i have an input like this: ABBBCCCDDDDDEFGD
in this case the output is: QB4CCCQD5FFDD
and i don't know why :(

推荐答案

有没有必要使用FSEEK倒带为u做,这是写了不使用它通过使用简单的计数器和放A code ;当前序列字符。

There is no need to use Fseek to rewind as u have done , Here is a code that is have written without using it by using simple counter & current sequence character.

C实现的:

#include<stdio.h>
#include<stdlib.h>

void main()
{ 
    FILE *source = fopen("Test.txt", "r");
    FILE *destination = fopen("Dest.txt", "w");
    char currentChar;
    char seqChar;
    int count = 0;

    while(1) {
      int flag = (fread(&currentChar, sizeof(char),1, source) == 0); 

      if(flag||seqChar!=currentChar) {

         if(count>3) {
           char ch = 'Q';
           int k = count;
           char str[100];
           int digits = sprintf(str,"%d",count);
           fwrite(&ch,sizeof(ch),1,destination);
           fwrite(&seqChar,sizeof(ch),1,destination);
           fwrite(&str,sizeof(char)*digits,1,destination);
         }
         else {
           for(int i=0;i<count;i++) 
              fwrite(&seqChar,sizeof(char),1,destination);
         }
         seqChar = currentChar;
         count =1;
      }

     else count++;

     if(flag)
       break;
    }

   fclose(source);
   fclose(destination);
}

这篇关于RLE COM pression算法的c的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆