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;
}
分享到:
相关推荐
4. **编码与解码**:编码阶段是将字符按照哈夫曼编码转换成二进制序列,而解码阶段则是反过来,将二进制序列还原成原来的字符。这两个过程都需要高效的算法来实现。 5. **实验报告**:课程设计完成后,学生需要撰写...
综上所述,这个C++实现的哈夫曼编译码器涵盖了数据结构(如二叉堆和哈夫曼树)、算法(哈夫曼编码与解码)、文件操作以及内存管理等多个IT领域的核心知识点。通过学习和理解这个项目,开发者可以深入掌握这些概念并...
哈夫曼编译码器课程设计报告 本报告是一个关于哈夫曼编译码器的课程设计报告,涵盖了哈夫曼编译码器的基本概念、设计要求、算法设计、流程图、源代码等方面的内容。 哈夫曼编译码器是一种高效的数据压缩算法,广泛...
哈夫曼编译码系统,课程设计c++语言,其中一些符号可以根据原理替换。
本文将详细阐述如何使用C语言编写一个哈夫曼编译码器,包括其核心算法和主要功能。 首先,我们定义了`HTNode`结构体,它代表赫夫曼树的节点,包含了节点的权值(weight)、字符(ch)、父节点(parent)、左孩子...
数据结构-基本算法-哈夫曼编译码器(学生时代源码,调试可运行)
### 数据结构哈夫曼编译码器 #### 需求分析 哈夫曼编码(Huffman Coding)是一种广泛应用于数据压缩领域的技术。通过利用字符出现的频率来为每个字符分配一个唯一的二进制编码,可以有效地减少数据的存储空间和...
标题和描述中提到的“数据结构 哈夫曼编译码器”是计算机科学领域中的一个重要概念,尤其是在数据压缩算法中占有举足轻重的地位。哈夫曼编码(Huffman Coding)是一种广泛使用的可变长度前缀编码,由David A. ...
使用C++实现哈夫曼编译码器,需要设计和实现几个关键数据结构和函数: - `Node`类:表示哈夫曼树的节点,包含字符、频率以及左右子节点。 - `HuffmanTree`类:用于构建和管理哈夫曼树,包含构建哈夫曼树、生成...
数据结构实验报告 《五、最优二叉树应用之哈夫曼编译码》
7. **文件操作**:在C++中,使用`fstream`库进行文件的读写操作,确保正确处理文件流。 8. **界面设计**:虽然在VC6环境下,UI设计相对简单,但仍需创建用户友好的界面,让用户可以输入文件、查看编码结果以及进行...
在本项目中,我们将探讨如何利用哈夫曼树进行二进制与字符串之间的转换。C语言是实现这一功能的一种常见编程语言,它以其简洁、高效而被广泛使用。 哈夫曼树的基本思想是通过构建一个具有特定性质的二叉树来实现...
2. **效率优化**:为了提高程序性能,可以使用C++的STL容器(如`vector`、`queue`)和算法,以及位操作来处理二进制数据。 3. **错误处理**:添加适当的错误检查机制,例如文件读写异常、数据格式错误等,以确保...
哈夫曼编码的基本思想是:频繁出现的字符用较短的二进制码表示,不常出现的字符用较长的二进制码表示。这样可以使得总体上编码长度最短,从而达到压缩数据的目的。其构建过程包括以下几个步骤: 1. **建立哈夫曼树*...
哈夫曼编译码器:根据给出的英文字母的使用频度建立哈夫曼树,并利用已经建好的哈夫曼树完成对电报的 1、编码 2、译码 3、打印编码 4、打印哈夫曼树 等四个功能。 (含报告、答辩视频)
4. **解码过程**:使用哈夫曼树进行反向操作,从编码的二进制序列出发,按照编码规则逐步找到对应字符,还原出原始文本。 在Matlab中实现哈夫曼编码,需要编写函数来完成上述步骤。首先,你需要读取二进制文档(如a...
在这个Matlab实现的程序中,我们可以通过对二进制文档进行哈夫曼编码来达到减小文件大小的目的。 哈夫曼编码的基本思想是为每个出现频率较高的字符分配较短的编码,而出现频率较低的字符则分配较长的编码。这个过程...
### 哈夫曼编译码系统的设计与实现 #### 实验目的 本次实验旨在深入理解和掌握哈夫曼树的基本概念及其在数据压缩中的应用。通过构建哈夫曼树并对文本进行编码和译码,加深对数据结构及其实际应用的认识。 #### ...
- 解码过程中,从哈夫曼树的根节点开始,按照输入的二进制代码逐位移动。 - 当到达一个叶子节点时,就找到了对应于当前二进制序列的字符。 - 继续处理剩余的二进制序列,直至全部解码完成。 #### 三、程序实现流程 ...
`bin`和`obj`目录通常包含编译过程中产生的中间文件和可执行文件,它们可能包含了经过哈夫曼编码压缩的二进制数据。 总结起来,基于二进制的哈夫曼编码通过构建哈夫曼树和为字符分配编码,实现了文件的有效压缩。...