统计时出的有关问题
统计时出的问题
做哈夫曼编码的时候测试一下统计的代码,如下
代码:
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
int main(int argc, char **argv)
{
if(argc < 2)return -1;
ifstream ifile(argv[1]);
if(!ifile) return -1;
unsigned int w[256];
memset(w, 0, 256*sizeof(int));
w[255] = 0;
while(!ifile.eof()){
unsigned char in = ifile.get();
w[in]++;
}
for(int i=0;i <256;i++) cout < < i < < " with counts: " < < w[i] < < endl;
return 0
}
结果在文本文件的统计时总是多了一个255的值,也就是最后一行至少是1(可执行文件的时候有可能大于1),这个255是这么来的
------解决方案--------------------
上楼还是跟楼主学把,这样做下标是统计中常用的
楼主的问题在于
in = ifile.get(); //如果到文件尾,不会立刻设置为eof,因此你总会多一次循环
正确的做法
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
int main(int argc, char **argv)
{
if(argc < 2)return -1;
ifstream ifile(argv[1]);
if(!ifile) return -1;
unsigned int w[256];
memset(w, 0, 256*sizeof(int));
w[255] = 0;
unsigned char in = ifile.get();
while(!ifile.eof()){
w[in]++;
in = ifile.get();
}
for(int i=0;i <256;i++) cout < < i < < " with counts: " < < w[i] < < endl;
return 0
}
------解决方案--------------------
feof 函数在读取出错【后】方可根据置位标志判断文件结束。
因此,
先读取后判断可以及时停止操作过程;
如果先判断,后读取,那么最后会有一次多余操作。
做哈夫曼编码的时候测试一下统计的代码,如下
代码:
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
int main(int argc, char **argv)
{
if(argc < 2)return -1;
ifstream ifile(argv[1]);
if(!ifile) return -1;
unsigned int w[256];
memset(w, 0, 256*sizeof(int));
w[255] = 0;
while(!ifile.eof()){
unsigned char in = ifile.get();
w[in]++;
}
for(int i=0;i <256;i++) cout < < i < < " with counts: " < < w[i] < < endl;
return 0
}
结果在文本文件的统计时总是多了一个255的值,也就是最后一行至少是1(可执行文件的时候有可能大于1),这个255是这么来的
------解决方案--------------------
上楼还是跟楼主学把,这样做下标是统计中常用的
楼主的问题在于
in = ifile.get(); //如果到文件尾,不会立刻设置为eof,因此你总会多一次循环
正确的做法
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
int main(int argc, char **argv)
{
if(argc < 2)return -1;
ifstream ifile(argv[1]);
if(!ifile) return -1;
unsigned int w[256];
memset(w, 0, 256*sizeof(int));
w[255] = 0;
unsigned char in = ifile.get();
while(!ifile.eof()){
w[in]++;
in = ifile.get();
}
for(int i=0;i <256;i++) cout < < i < < " with counts: " < < w[i] < < endl;
return 0
}
------解决方案--------------------
feof 函数在读取出错【后】方可根据置位标志判断文件结束。
因此,
先读取后判断可以及时停止操作过程;
如果先判断,后读取,那么最后会有一次多余操作。