0

我是地图新手,所以有点不确定最好的方法。该任务与使用霍夫曼编码的压缩有关。这就是我所拥有的。

#include <map>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

typedef map<char,int> huffmanMap;

void getFreq(string file, map<char, int> map) 
{ 
    map.clear();    
    for (string::iterator i = file.begin(); i != file.end(); ++i) {
        ++map[*i];   
    }
}

以上是我在网上找到的一种方法,但无法打印任何内容

int main()
{
    map<char, int> huffmanMap;
    string fileline;

    ifstream myfile;
    myfile.open("text.txt",ios::out); 

    while(!myfile.eof())  {
    getline(myfile, fileline); //get the line and put it in the fileline string
    }
    myfile.close();

我从一个文本文件中读入一个来填充字符串文件行。

    for (int i=0; i<fileline.length(); i++) {
        char t = fileline[i];
        huffmanMap[i]? huffmanMap[i]++ : huffmanMap[i]=1;
    }

这是我尝试填充地图的第二种方法,字符值不正确,符号和笑脸..

    getFreq(fileline,huffmanMap);

    huffmanMap::iterator position;
    for (position = huffmanMap.begin(); position != huffmanMap.end(); position++)  {
        cout << "key: \"" << position->first << endl;
        cout << "value: " << position->second << endl;
    }

这就是我尝试打印地图的方式

    system("pause");
    return 0;
}

当我运行我的 getFreq 方法时,程序崩溃了。我没有得到任何错误。使用第二种方法,char 值是无意义的。注意我没有同时运行这两种方法,我只是将它们都包含在内以显示我尝试过的内容。

任何见解将不胜感激。谢谢。对初学者宽容一点;)

4

2 回答 2

3

你的代码到处都是,它不是很连贯,所以很难理解流程。

以下是一些低光:

这是错误的myfile.open("text.txt",ios::out);-为什么要打开带有out标志的输入流?它应该是:

string fileline;
ifstream myfile("text.txt"); 

while(getline(myfile, fileline))  {
   // now use fileline.
}

在 while 循环中,您要做的是遍历内容并将其添加到您的地图中吗?所以现在代码看起来像:

string fileline;
ifstream myfile("text.txt"); 

while(getline(myfile, fileline))  {
   getFreq(fileline, huffmanMap);
}

下一个修复,这是错误的:你有一个 typedef 和一个同名的变量!

typedef map<char,int> huffmanMap;

map<char, int> huffmanMap;

使用合理的命名

typedef map<char,int> huffmanMap_Type;

huffmanMap_Type huffmanMap;

下一个修复,您的getFreq方法签名是错误的,您通过值(即副本)而不是引用传递映射,因此您在函数中的修改是副本而不是原始!

错误的:void getFreq(string file, map<char, int> map)

正确的:void getFreq(string file, huffmanMap_Type& map)

下一篇:为什么clear()在上面的方法中?如果有多条线怎么办?确定不需要吗?

现在就足够了,如果还有更多问题,请清理您的代码并更新您的问题。

于 2011-03-11T11:55:48.343 回答
2

一修复一改进。

修复是:在getFreq参考中制作第二个参数:

void getFreq(string file, map<char, int> & map); //notice `&`

改进是:只写

huffmanMap[i]++;

代替

huffmanMap[i]? huffmanMap[i]++ : huffmanMap[i]=1;

毕竟,通过写作huffmanMap[i]?你是在检查它是否为零。如果为零,则将其设为 1,与 相同huffmanMap[i]++

于 2011-03-11T11:48:02.093 回答