如何为txt文件中的每个名称创建一个整数?

时间:2014-08-27 14:30:00

标签: c++ sorting text-files

我有一个包含以下内容的文本文件:Bill, 89 Alex, 64 Dan, 29,代表一些学生的姓名及其注释。
我想按笔记对它们进行升序排序,我的想法是为每个名称创建一个整数,例如:int dan = 29;所以我可以对它们进行排序,但我不知道如何为这些名称分配一个整数文本文件 希望你能帮忙,因为这是我第一次制作一个更复杂的程序。谢谢!

4 个答案:

答案 0 :(得分:5)

这里的问题是在C ++中(如在C中)你必须在编译时中定义所有变量,即编写代码时。在您的示例中,您拥有包含任意行数的文本文件,因此在编写代码时您并不真正了解它的内容。这就是为什么你的文件的每一行都没有自己的变量的原因。 因此,如果您需要存储有关文件每一行的信息,则可以执行此操作。首先,定义将存储信息(即带有名称+整数的字符串)的格式。这是您最有可能需要struct或类似的地方。 structclass是在一个结构中聚合不同变量的方法(实际上,它们不仅仅是那个,但目前不是重点)。如果你写了像

那样的smth
struct Data {
  std::string name;
  int ratio;
};

这意味着您刚刚定义了名为Data的数据类型,其中包含字段" name"和"比率"。所以你可以像这样使用它:

Data d;
d.name = "Ben";
d.ratio = 42;

在此之后,您需要一些可以让您存储许多数据条目的实体。例如,您可以使用数组。想象一下,你将在这里使用静态数组:

const std::size_t lineCount = getLineCount();
Data data_array[lineCount]; //Will not compile, since you cannot use variables as static arrays's size
for( std::size_t i = 0; i < lineCount; ++i ) {
  data_array[i].name = readName();
  data_array[i].ratio = readRatio();
}

问题在于,您可以看到,在编写代码时,您无法知道文本文件的行数。所以你可以用这段代码动态数组:

const std::size_t lineCount = getLineCount();
Data* data_array = new Data[lineCount];
for( std::size_t i = 0; i < lineCount; ++i ) {
  data_array[i].name = readName();
  data_array[i].ratio = readRatio();
}
delete[] data_array;

如果你在实际工作之前完成了你的文件,那么你可以设法知道行的数量,这将是有效的。

原始动态数组也不是很好用,因为您必须担心新的/删除功能对。因此,这里有来自Standart Template Library的名为 containers 的类。这些类为您提供了在其中插入数据的方法,并以多种方式使用此数据。这是类&#34; map&#34;,&#34; unordered_map&#34;,&#34; multimap&#34;,&#34; vector&#34;和其他人从以前的答案。他们最容易理解的是矢量,你可以阅读它here。其他人(说&#39; d,map)应该更适合你的任务。

最后,要对此类数据的数组(或容器)进行排序,您可以使用Standart Template Library中名为算法的函数。它们提供了以您需要的方式操作数据的通用方法。 您可以阅读更多here

不确定我需要在这里多说些,探索链接,继续学习,祝你好运!

答案 1 :(得分:2)

可能有一种更聪明的方法可以做到这一点,但既然你是初学者就是我的建议:

使用std::multimap<int, std::string>作为std::string注释的名称(存储为int)的查找表。如果某些名称具有相同的std::multimap值,则需要std::map而不是int。另外,将所有数字存储在std::vector<int>中并致电std::sort()以对std::vector<int>进行排序。现在它们已经排序,您可以使用std::multimap::find()查找与每个int值相关联的名称。

答案 2 :(得分:0)

使用std::unordered_map<string, int>

//用法:

std::unordered_map<string, int> content;
//open file;
while(/*not end of file*/){
   std::string name;
   int mark;
   file>>name>>mark;
   name.erase(name.end()-1);
   content[name]=mark;
}
//close file;

答案 3 :(得分:0)

struct name_and_mark{
    std::string name;
    int mark;
    bool operator<(name_and_mark &second){
        return mark<second.mark;
    }
};

std::istream& operator>>(std::istream &stream, name_and_mark &data){
    stream>>data.name>>data.mark;
    data.name.erase(data.name.end()-1);
    return stream;
}

std::forward_list<name_and_mark> content;
//open file;
while(/*not end of file*/){
    name_and_mark temp;
    file>>temp;
    content.push_front(temp);
}
//close file;
content.sort();

//检查出来:

std::ostream& operator<<(std::ostream &stream, name_and_mark &data){
    stream<<data.name<<", "<<data.mark<<'\n';
    return stream;
}

for(auto &i:content)
    std::cout<<i;