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