哈夫曼树解压缩中踩的坑&碰到的细小知识点

这篇five文章由来:
本菜鸡每次都反复查一些查过但是忘记掉的知识点,并且掉进一些大坑摔个半死_(:з」∠)_
缓慢更新ing

map insert覆盖问题

这个是真的太几把坑爹了,如果每次传入的value值是个指针对象,那么最后一次的值会覆盖所有的值……在做哈夫曼编码的时候用的是递归,所以每次传入的都是同个指针,崩溃地发现每个字符的哈弗曼编码都他妈的相同啊!!!
错误示范×:

//此代码在递归出口处执行
strcpy(root->hfcode, code);
hftab.insert(pair<unsigned char,char*>(root->ch, temp));

正确示范√:

//此代码在递归出口处执行
strcpy(root->hfcode, code);
char* temp = new char[256];
strcpy(temp, code);
hftab.insert(pair<unsigned char,char*>(root->ch, temp));

简而言之,每次都要申请新空间用于插入value。
估计和STL内部实现有关系,本人不求甚解,摔下去记得就行(。)
·
·
·

分离、组合文件路径

比自己想半天获得字符要快得多,奥利给!
示例:

#include<iostream>
#include<string.h>
using namespace std;
 
int main()
{
    char path[_MAX_PATH] = "D:\\soft\\programming\\vmware.exe";
    char drive[_MAX_DRIVE];//盘符-"D:"
    char dir[_MAX_DIR];//相对盘符的路径-"\soft\programming\"
    char fname[_MAX_FNAME];//文件名-"vmware"
    char ext[_MAX_EXT];//包括后缀的文件名-".exe"
    _splitpath(path, drive, dir, fname, ext);
    _makepath(path, drive, dir, fname, ext);
    return 0;
}

·
·
·

动态内存分配并做初始化calloc

非常有用的东西子,这次写代码的时候疯狂报关于内存的错,很需要这个解决。很多时候不搞初始化,后果很严重。以前一直没有这个意识,参考别人代码的时候才知道。果然废物。

原型:void* calloc(unsigned int num,unsigned int size);
功能:在内存的动态存储区中分配num个长度为size的连续空间;
注意:num:对象个数,size:对象占据的内存字节数,相较于malloc函数,calloc函数会自动将内存初始化为0;

//为hfcode这个字符数组分配100个字符空间,且内容都为0
char* hfcode= (char*)calloc(sizeof(char), 100);

·
·
·

fread

size_t fread( void *restrict buffer, size_t size, size_t count, FILE *restrict stream );

从给定输入流stream读取最多count个对象到数组buffer中(相当于以对每个对象调用size次fgetc),把buffer当作unsigned char数组并顺序保存结果。流的文件位置指示器前进读取的字节数。
若出现错误,则流的文件位置指示器的位置不确定。若没有完整地读入最后一个元素,则其值不确定。
这次我用来读取配置信息,配置信息是用一个结构存放的,那么size就是sizeof(headinf)
示例:

FILE* fpIn = fopen(source, "rb");
headinf* newhead = (headinf*)calloc(sizeof(headinf), 1);
fread(newhead, 1, sizeof(headinf), fpIn);

·
·
·

fseek文件定位

int fseek(FILE *stream, long offset, int fromwhere);

函数设置文件指针stream的位置。
如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset取值大于等于210241024*1024,即long的正数范围2G),则不改变stream指向的位置,函数返回一个非0值。
其中第三个参数如果是SEEK_SET表示文件头。
·
·
·

strlen()求字符数组长度

字符数组以’\0’结束,通过这个求长度。

char temp[8];
strcpy(temp, hftab[it->first]);
int len = strlen(temp);

有几个字符就多少长。’\0’是不算的。

strcmp()比较两个字符数组内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值