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())几乎肯定会导致问题(通常似乎读取文件的最后一行两次)。您几乎肯定想根据尝试读取的结果来读取值和循环的基本延续。

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

那应该从输入文件的一行读取数据。然后你可以使用一个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 *. 复制指针不会复制字符串!下次插入时插入的是相同的指针,所以现在有两个指向同一个字符串的指针。随着该字符串被新输入覆盖,地图中的所有副本都会更改。

于 2012-04-30T16:26:18.610 回答