昨天老师要求用赫夫曼算法实现一个简单的解压缩程序,我先做了一个文本类Text:
大致想法是将用户输入的待压缩或待解压的文件路径保存在path中(DOS就是这么麻烦。。。),在length中保存文本中字符长度(包括空格)。
在写showText()方法时,却发现path无法作用:
以下是编译器毫不留情的报错:
在使用强制转换也无效后,我只好用了一个笨办法:将path中的字符逐个的装入字符数组中,再将字符数组的首地址放入一个字符指针常量中。以下是改进的代码,增加了一个转换的函数:
这次编译顺利通过,但结果依然惨淡:(测试文本为test.txt,内容:this is a test.)
图中数字是我在主函数中输出的length.显然ifstream in(p)并没有真正执行。
仔细一想,string类事实上就是对字符数组的封装而已,换句话说,string里字符数组仍然存在。本着这个想法,我在string的方法里找到了c_str()。c_str()方法返回一个C风格 的指针,指向string的值 。
再次修改代码,删除了麻烦的stringToCharArray():
这回编译器就像我一样愉快地接受了这个办法:
查看了MSDN后,又发现了一个data()方法。
如上三种方法中,输出都是相同的。至于data()和c_str()的区别,网上的一些帖子中认为:
data()得到的是字符数组,里面有 '\0 ',当然也不会删掉,string的原则就是无视这个c字符串规则.
而c_str()是产生c字符串,也就是即使没有 '\0 '结尾,她也会添加一个.
总的来说,也就是字符数组和C字符串的区别。
以下是vs7.1(话说什么是VS7.1?)下的两个函数的源码:
const _Elem *c_str() const
{ // return pointer to null-terminated nonmutable array
return (_Myptr());
}
const _Elem *data() const
{ // return pointer to nonmutable array
return (c_str());
}
回过头来考虑第一种方法:
在第一种修改方法中,已经自行将string的内容复制到了字符数组中,并将字符数组的首地址赋予了字符指针常量p,但在ifstream in(p);后仍然没有读入文本。下午英语期中考试完后和同学讨论,总算得出了原因:没有在获得的字符数组最后一位加上C串的结束符:"\0"。。。。。。
大致想法是将用户输入的待压缩或待解压的文件路径保存在path中(DOS就是这么麻烦。。。),在length中保存文本中字符长度(包括空格)。
在写showText()方法时,却发现path无法作用:
以下是编译器毫不留情的报错:
在使用强制转换也无效后,我只好用了一个笨办法:将path中的字符逐个的装入字符数组中,再将字符数组的首地址放入一个字符指针常量中。以下是改进的代码,增加了一个转换的函数:
这次编译顺利通过,但结果依然惨淡:(测试文本为test.txt,内容:this is a test.)
图中数字是我在主函数中输出的length.显然ifstream in(p)并没有真正执行。
仔细一想,string类事实上就是对字符数组的封装而已,换句话说,string里字符数组仍然存在。本着这个想法,我在string的方法里找到了c_str()。c_str()方法返回一个C风格 的指针,指向string的值 。
再次修改代码,删除了麻烦的stringToCharArray():
这回编译器就像我一样愉快地接受了这个办法:
查看了MSDN后,又发现了一个data()方法。
如上三种方法中,输出都是相同的。至于data()和c_str()的区别,网上的一些帖子中认为:
data()得到的是字符数组,里面有 '\0 ',当然也不会删掉,string的原则就是无视这个c字符串规则.
而c_str()是产生c字符串,也就是即使没有 '\0 '结尾,她也会添加一个.
总的来说,也就是字符数组和C字符串的区别。
以下是vs7.1(话说什么是VS7.1?)下的两个函数的源码:
const
{ //
return
}
const
{ //
return
}
回过头来考虑第一种方法:
在第一种修改方法中,已经自行将string的内容复制到了字符数组中,并将字符数组的首地址赋予了字符指针常量p,但在ifstream in(p);后仍然没有读入文本。下午英语期中考试完后和同学讨论,总算得出了原因:没有在获得的字符数组最后一位加上C串的结束符:"\0"。。。。。。