#include <stdio.h>
#include<string.h>
#include<stdlib.h>
//压缩函数,采用开解循环提高效率
void ASCII_Compress(char *dest,char *src)
{
dest[0]=src[0];
dest[1]=src[1];
dest[2]=src[2];
dest[3]=src[3];
dest[4]=src[4];
dest[5]=src[5];
dest[6]=src[6];
dest[0]|=((src[7]&0x40)<<1);
dest[1]|=((src[7]&0x20)<<2);
dest[2]|=((src[7]&0x10)<<3);
dest[3]|=((src[7]&0x8)<<4);
dest[4]|=((src[7]&0x4)<<5);
dest[5]|=((src[7]&0x2)<<6);
dest[6]|=((src[7]&0x1)<<7);
}
size_t ASCII_ReadStream(char* buf,FILE *stream)
{
size_t nCount=0;
nCount=fread(buf,1,8,stream);
return nCount;
}
char*ASCII_CompressName(char*OldName)
{
char*newName=(char*)malloc(strlen(OldName)+5);
strcpy(newName,OldName);
strcat(newName,".ASC");//拓展名ASC short for ASCII_Compress
return newName;
}
void ASCII_CompressWrite(FILE *ReadStream,FILE *WriteStream)
{
size_t nCount=0;
char buf[7],src[8];
while(nCount=ASCII_ReadStream(src,ReadStream))
{
if(8==nCount)
{
ASCII_Compress(buf,src);
fwrite(buf,1,7,WriteStream);
}
else
fwrite(src,1,(int)nCount,WriteStream);
}
}
int main(int argc,char* argv[])
{
FILE *FileRead,*FileWrite;
if(FileRead=fopen(argv[1],"r+"))
{
char*newName=ASCII_CompressName(argv[1]);
FileWrite=fopen(newName,"a+");
free(newName);
if(!FileWrite)
goto Main_OpenFile_Worry;
ASCII_CompressWrite(FileRead,FileWrite);
fclose(FileWrite);
Main_OpenFile_Worry:
fclose(FileRead);
}
else
printf("Open worry/n");
return 0;
}