class BITFILE
{
private:
char *name;
FILE *file;
unsigned char buf;
int writeBit;
long size;
bool isRead;
// unsigned long fileLength;
// unsigned long readed;
public:
bool haveFile(){if(file==NULL)return false;return true;};
BITFILE(char* pname,char rw);
int readInt();
char readChar();
bool write(char bit);
bool write(int bit);
void close();
long Size();
bool Eof();
};
bool BITFILE::Eof()
{
if(isRead&&size==1)return true;
if(feof(file)&&isRead)return true;
return false;
}
long BITFILE::Size()
{return size;}
char BITFILE::readChar()
{
if(file==NULL)return -1;
if(isRead){
if(size==1)return -1;
if(writeBit=0)
{
if(feof(file))return -1;
buf=fgetc(file);
// readed++;
if(buf==EOF)return -1;
writeBit=8;
}
int temp=buf;
temp>>=(writeBit-1);
switch(writeBit)
{
case 1:buf=0;break;
case 2:buf&=0x01;break;
case 3:buf&=0x03;break;
case 4:buf&=0x07;break;
case 5:buf&=0x0f;break;
case 6:buf&=0x1f;break;
case 7:buf&=0x3f;break;
case 8:buf&=0x7f;break;
default:return -1;
}
writeBit--;
size--;
return '0'+temp;
}else return -1;
}
int BITFILE::readInt()
{
if(file==NULL)return -1;
if(isRead){
if(size==1)return -1;
if(writeBit==0)
{
if(feof(file))return -1;
buf=fgetc(file);
// readed++;
if(buf==EOF)return -1;
writeBit=8;
}
int temp=buf;
temp>>=(writeBit-1);
switch(writeBit)
{
case 1:buf=0;break;
case 2:buf&=0x01;break;
case 3:buf&=0x03;break;
case 4:buf&=0x07;break;
case 5:buf&=0x0f;break;
case 6:buf&=0x1f;break;
case 7:buf&=0x3f;break;
case 8:buf&=0x7f;break;
default:return -1;
}
writeBit--;
size--;
return temp;
}else return -1;
}
BITFILE::BITFILE(char* pname,char rw)
{
if(rw=='r')isRead=true;
if(rw=='w')isRead=false;
size=0;
buf=0;
writeBit=0;
name=pname;
// readed=0;
if(rw=='r')
{
file=fopen(pname,"rb");
fseek(file,-sizeof(long),SEEK_END);
fread(&size,sizeof(long),1,file);
rewind(file);
// cout<<"file size: "<<size<<endl;
return;
}
if(rw=='w')
file=fopen(pname,"wb");
else
file=NULL;
}
bool BITFILE::write(int bit)
{
if(isRead)return false;
if(file==NULL)return false;
// cout<<bit;
if(bit==1)
{
buf<<=1;
buf|=1;
writeBit++;
if(writeBit%8==0){
fputc(buf,file);
buf=0;
writeBit=0;
}
size++;
return true;
}if(bit==0)
{
buf<<=1;
writeBit++;
if(writeBit%8==0)
{
fputc(buf,file);
buf=0;
writeBit=0;
}
size++;
return true;
}return false;
}
void BITFILE::close(){
if(file==NULL)return;
if(isRead==false)
{
int left=8-writeBit;
if(writeBit==0){fwrite(&size,sizeof(long),1,file);fclose(file);return;}
if(writeBit==8){fwrite(&size,sizeof(long),1,file);fclose(file);return;}
if(writeBit<8)
for(int i=0;i<left;i++)
{
write(1);
size--;
}
// cout<<"FILESIZE: "<<size<<endl;
fwrite(&size,sizeof(long),1,file);
fclose(file);
}else{
buf=0;
writeBit=0;
size=0;
fclose(file);
}
}
//bit只能为 '1'或'0'
bool BITFILE::write(char bit)
{
if(isRead)return false;
if(file==NULL)return false;
if(bit=='1')
{
buf<<=1;
buf|=1;
writeBit++;
if(writeBit%8==0){
fputc(buf,file);
buf=0;
writeBit=0;
}
size++;
return true;
}if(bit=='0')
{
buf<<=1;
writeBit++;
if(writeBit%8==0)
{
fputc(buf,file);
buf=0;
writeBit=0;
}
size++;
return true;
}return false;
}
分享到:
相关推荐
非常完美的数据结构课程设计(哈夫曼编译码器 )非常完美的数据结构课程设计(哈夫曼编译码器 )非常完美的数据结构课程设计(哈夫曼编译码器 )非常完美的数据结构课程设计(哈夫曼编译码器 )非常完美的数据结构...
数据结构 哈夫曼编译码器 数据结构 哈夫曼编译码器 数据结构 哈夫曼编译码器
哈夫曼编译码器课程设计报告(完整版)--30页.pdf
数据结构课程设计哈夫曼编译码器,里面比较齐全,实验报告、源程序、调试过程,而且此程序为通用程序,无任何个人信息,懒得装VC6.0的直接改个名字学号就可以交了
哈夫曼编译码系统,课程设计c++语言,其中一些符号可以根据原理替换。
哈夫曼编译码器 是我的 数据结构课程设计 c++语言编写 用vc6编写 是源文件
用C语言编写的哈夫曼编译码器 界面简单,功能容易理解
用C++实现的哈夫曼编译码器,可以实现创建哈夫曼树、对txt文件进行编码、译码,也可以查看生成的哈夫曼树。
数据结构-基本算法-哈夫曼编译码器(学生时代源码,调试可运行)
数据结构的课程设计,哈夫曼编译码器,附带报告
数据结构实验报告 《五、最优二叉树应用之哈夫曼编译码》
上机报告哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行...
哈夫曼编译码器:根据给出的英文字母的使用频度建立哈夫曼树,并利用已经建好的哈夫曼树完成对电报的 1、编码 2、译码 3、打印编码 4、打印哈夫曼树 等四个功能。 (含报告、答辩视频)
C语言课程设 计哈夫曼编译码 建树,程序简单易懂,设和初学者
利用哈夫曼树,将二进制与字符串转换.这是一个简单的编程,C语言写的.
哈弗曼编译码系统源代码的实现有利于帮助我们大家更好地学习数据库
数据结构课程设计哈夫曼编译码器,带运行截图
用C语言编写的数据结构,哈夫曼编译码器!
有关树的应用,利用哈夫曼树的构造算法和哈夫曼编译码的算法进行译码。例如给定编码能给出相应的译码,并存入文件。