这篇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’是不算的。