行程编码

对数据进行行程编码

//
//  main.cpp
//  zip
//
//  Created by Esion on 2017/3/22.
//  Copyright © 2017年 Esion. All rights reserved.
//

#include <iostream>
#include <fstream>
char a,ch1=NULL;

int main(int argc, const char * argv[]) {
    
    int count=0;
    bool isdec = false;
    std::string str1,str2,d_or_t;
    while(true){
        printf("请选择功能:\n");
        printf("-i 压缩\n");
        printf("-d 解压\n");
        printf("-q 退出\n");
        std::cin>>d_or_t;
        if(d_or_t=="q")
            break;
        printf("输入或拖入源文件\n");
        std::cin>>str1;
        printf("输入或拖入目的文件\n");
        std::cin>>str2;
        std::ifstream in;
        std::ofstream out;
        in.open(str1);
        out.open(str2);
        if(d_or_t=="d")    //如果输入d为解压将str1目录的文件解压到str2中
            while(in>>a){
                if(!isdec){          //如果不在解压状态
                    if(a=='('){      //判断是否为(,如果是跳过该字符便进入压缩状态
                        isdec=true;  //
                    }
                    else{            //否则直接输出该字符
                        std::cout<<a;
                        out<<a;
                    }
                }
                else{               //如果进入压缩状态
                    ch1=a;          //记录字符
                    in>>a;
                    count=a-'0';
                    in>>a;
                    count=count*10+(a-'0');//记录长度
                    while(count--){        //输出
                        std::cout<<ch1;
                        out<<ch1;
                    }
                    count=0;
                    isdec=false;           //重新进入非解压状态
                }
            }
        else{            //否则将str1压缩至str2
            count=1;
            int src=0;//记录源字符长度
            int des=0;//记录压缩后字符长度
            in>>a;
            while(in>>a){
                src++;
                if(a!=ch1){                //该位字符不等于上一位字符的时候
                    if(count>=4){          //如果长度大于4压缩
                        std::cout<<'('<<ch1;
                        out<<'('<<ch1;
                        des++;
                        if(count<10){      //固定数字位数为2位
                            
                            out<<0<<count;
                            des++;
                            std::cout<<0<<count;
                        }
                        else{
                            out<<count;
                            des++;
                            std::cout<<count;
                        }
                    }
                    else{                 //字符短于4,不压缩
                        while(count--){
                            std::cout<<ch1;
                            out<<ch1;
                            des++;
                        }
                    }
                    ch1=a;                //记录该位字符
                    count=1;
                }
                else
                    count++;               //该位字符等于上一位的时候累加
                
                
            }
            if(count>=4){                  //跳出循环后对尾部进行判断
                std::cout<<'('<<ch1;
                out<<'('<<ch1;
                des++;
                if(count<10){
                    std::cout<<0<<count;
                    out<<0<<count;
                    des++;
                }
                else{
                    std::cout<<count;
                    out<<count;
                    des++;
                }
            }
            else{
                while(count--){
                    std::cout<<ch1;
                    out<<ch1;
                    des++;
                }
            }
            count=1;
            ch1=NULL;                      //清零字符
            std::cout<<std::endl<<"压缩比为:"<<des*1.0/src<<std::endl;//输出压缩比
            
        }
        in.close();
        out.close();
    }
    
    // insert code here...
    return 0;
}

    原文作者:游程编码问题
    原文地址: https://blog.csdn.net/A15957108648/article/details/70332670
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞