关于文件压缩的代码

来源:互联网 发布:win10网络图标红叉 编辑:程序博客网 时间:2024/05/23 20:07

一,目标

写一个程序压缩文件已生成另外一个新文件。新文件要比原始文件小。检查结果,确保程序可以利用新文件重新生成新的文件。

二,示例代码

#include<stdio.h>#define MAX_NUM 10void compression(char *start, int number[],char array[],int *subscript);void unzip(int subscript,char start,int number[]);void main(){int subscript = 0;char start;int number[MAX_NUM];char num[] = "0000000000000001111111111111111111100000111111111111111111111111111111111";/***************************    压缩部分    *********************************/compression(&start,number,num,&subscript);printf("个数是:%d\n",subscript);printf("开头是:%c\n",start);printf("数组为:");printf("\n");/***************************    解压部分    *********************************/unzip(subscript,start,number);}void compression(char *start, int number[],char array[],int* subscript){    *subscript = 0;int count = 0;*start = array[0];for (int i = 0;; i++){if (array[i] == 0){break;}//不要写number[subscript]++,只能写成number[subscript]=count因为number[]初始为负的很多数。count++;if (array[i] != array[i + 1]){number[*subscript] = count;count = 0;//注意:这里不能是*subscript,因为++的优先级大于*.(*subscript)++;}}}void unzip(int subscript,char start,int number[]){int real_start = start - '0';for (int i = 0; i < subscript; i++){for (int j = 0; j < number[i]; j++){printf("%d",real_start);}//当初在这个问题上纠结了很久,就是,我们很容易识别出第一个,但是第二个如何取成另一个,并且不断//循环迭代下去,一开始我用的real_start = real_start是char型的,但最后发现char型容易乱码,所以//最后确定用int型,int型是不会乱码的。real_start = !real_start;}}
三,思想

1,压缩的思想:先确定数组的初始为0还是1,然后依次统计0和1出现的次数形成一个int型的数组,例如000000000011111可以用一个int型的{10,5}表示。

四,需要处理的细节问题。

1,初定义一个数组,例如char array[10];想把它的值赋成1不能采用array[0]++这种的方式,应该采用array[0] = 1的方式,因为array[10]的初始是把它设置成类似-8888(大约)这种无穷小的数。

2,想把一个指针指向的内容加一,例如*pointer以前为0,想把它的值变成1,不能采用*pointer++这种方式,应该采用(*pointer)++这种方式,因为++的优先级高于*。

3,想把一个值取反为0,再取反为1,不能用char型变量,应该采取int型变量。

原创粉丝点击