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];   
    }
}

上記はオンラインで見つけた方法の 1 つですが、何も印刷できませんでした

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;
    }

これは、マップにデータを入力するために試した 2 番目の方法です。char 値は正しくありません。記号とスマイリーフェイスです。

    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 メソッドを実行すると、プログラムがクラッシュします。どちらでもエラーは発生しません。2 番目の方法では、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

1つの修正と1つの改善。

修正は次のとおりです。getFreq参照で2番目のパラメーターを作成します。

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 に答える