如何为txt文件中的每个名称生成一个整数

How can I make a integer for every name in a txt file?

本文关键字:整数 一个 文件 txt      更新时间:2023-10-16

我有一个文本文件,内容如下:Bill, 89 Alex, 64 Dan, 29,它表示一些学生的名字和他们的笔记
我想按注释升序排序,我的想法是为每个名称创建一个整数,例如:int dan = 29;,这样我就可以对它们进行进一步排序,但我不知道如何从文本文件中为这些名称指定一个整数
希望你能帮忙,因为这是我第一次做一个稍微复杂一点的程序。非常感谢。

这里的问题是,在C++中(就像在C中一样),您必须在编译时定义所有变量,即在编写代码时。在您的例子中,您有一个任意行数的文本文件,所以当您编写代码时,您并不真正了解它的内容。这就是为什么不能为文件的每一行都有自己的变量的原因。因此,如果您需要存储文件每一行的信息,您可以这样做。首先,您定义信息(即名称+整数的字符串)的存储格式。这是你最可能需要struct或类似东西的地方。structclass是在一个结构中协调不同变量的方法(本质上,它们不止于此,但目前还不是重点)。如果你写的smth像

struct Data {
  std::string name;
  int ratio;
};

这意味着您只定义了名为data的数据类型,该类型具有字段"name"answers"ratio"。所以你可以这样使用它:

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;

如果您在实际工作完成之前设法知道文件的行数,这将起作用,而这通常不是重点。

此外,原始动态数组使用起来也不太好,因为您必须担心新的/delete函数对。因此,Standart模板库中名为containers的类正在发挥作用。此类为您提供了一种方法,可以在其中插入数据,并以多种方式使用这些数据。这是以前的答案中的类"map"、"unordered_map"、"multimap"answers"vector"等。其中最容易理解的是矢量,你可以在这里读到它。其他人(比如说,地图)应该更适合你的任务。

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

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

可能有一种更聪明的方法可以做到这一点,但由于您是初学者,我建议您:

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

使用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;
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;
相关文章: