0

したがって、これの目的は、次のような番号と名前を含むテキストファイルを読み込むことです。

50 Leonardo
20 Donatello 
100 Rapheal
40 Michelagelo

私はちょうどそれが正しく入っていることを確認するためにそれを印刷するところだった。予想どおりにテキストファイルの複製を取得する代わりに、すべての名前に対して姓が繰り返されます。

これは私が得るものです:

Michelagelo 50
Michelagelo 20
Michelagelo 100
Michelagelo 100

コード:

ifstream top;   
    char output[100];
    char* defaultName = "Default";
    int tempTop;
    char* tempName;


    top.open("top.txt");        
    top.clear();
    top.seekg( 0, std::ios_base::beg );


    typedef multimap <char*, int> MM;
    MM top;

    if (top.is_open()) {        
        while (!top.eof()){

            //Get Score
            top>>output;
            tempTop=atoi(output); 


            //Get Name
            top>>output;
            tempName=output;

         cout << "Writing: " << tempName << " and " << tempTop << endl;
         top.insert(MM::value_type(tempName,tempTop));

        }
    }       

    MM::iterator i;

     for(i=top.begin(); i!=top.end(); i++){
          cout << (*i).first << " " <<  (*i).second << endl;
     }
     cout << "Size is: " << top.size() << endl;

私の他の質問は、ソートされたリストになると信じられたので、このマルチマップを使用しているということでしたか?

かなり混乱していて、私の初心者のやり方が私に示されているという誤りをいただければ幸いです。

TIA

4

2 に答える 2

2

char *あなたの問題は、あなたがすべきように使用するのではなく、主に直接使用しようとすることに起因しstd::stringます。を使用する場合はchar*、使用する各文字列を動的に割り当て、ポインタの代わりに文字列の内容を比較するためのコンパレータオブジェクトを提供する必要があります。

結論:std::string他に選択肢がない場合を除いて使用してください。本当に使用できないstd::string場合は、ほぼ確実に、少なくともほぼ同様の機能を提供する独自のクラスを作成する必要があります(ただし、検索や置換などはほとんど必要ありません)。

それが終了すると、別の小さな問題が発生します。問題while (!top.eof())が発生することがほぼ確実です(通常、ファイルの最後の行を2回読み取るように見えます)。ほぼ確実に、読み取りの試行結果に基づいてループの値とベースの継続を読み取りたいと思うでしょう。

while (top >> number >> name)
    MM.insert(MM::value_type(number, name));

編集:これを行っている場合は、明示的なループをまったく記述しないように、おそらく少し異なる方法で実装します。私は次のようなものから始めます:

typedef std::pair<std::string, int> v_t;

std::istream &operator>>(std::itream &is, v_t &v) {
     is >> v.second;
     std::getline(is, v.first);
     return is;
}

これにより、入力ファイルの1行からデータが読み取られます。次に、を使用しistream_iteratorてマルチマップにデータを入力できます。

std::ifstream top("top.txt");

// define multimap, initialized from stream:    
std::multimap<std::string, int> MM((std::istream_iterator<v_t>(top)),
                                    std::istream_iterator<v_t>());
于 2012-04-30T16:24:19.620 に答える
1

マルチマップに挿入すると、テンプレートパラメータに使用したタイプのコピーが挿入されます。この場合、それはchar *です。ポインタのコピーを作成しても、文字列のコピーは作成されません。次に挿入するときは同じポインタを挿入しているので、同じ文字列への2つのポインタがあります。その文字列が新しい入力で上書きされると、マップ内のすべてのコピーが変更されます。

于 2012-04-30T16:26:18.610 に答える