对数据进行行程编码
// // 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; }