如何为txt文件中的每个名称生成一个整数
How can I make a integer for every name in a txt file?
我有一个文本文件,内容如下:Bill, 89 Alex, 64 Dan, 29
,它表示一些学生的名字和他们的笔记
我想按注释升序排序,我的想法是为每个名称创建一个整数,例如:int dan = 29;
,这样我就可以对它们进行进一步排序,但我不知道如何从文本文件中为这些名称指定一个整数
希望你能帮忙,因为这是我第一次做一个稍微复杂一点的程序。非常感谢。
这里的问题是,在C++中(就像在C中一样),您必须在编译时定义所有变量,即在编写代码时。在您的例子中,您有一个任意行数的文本文件,所以当您编写代码时,您并不真正了解它的内容。这就是为什么不能为文件的每一行都有自己的变量的原因。因此,如果您需要存储文件每一行的信息,您可以这样做。首先,您定义信息(即名称+整数的字符串)的存储格式。这是你最可能需要struct
或类似东西的地方。struct
和class
是在一个结构中协调不同变量的方法(本质上,它们不止于此,但目前还不是重点)。如果你写的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;
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 如何将一个数组值合并为一个整数c++
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 我可以将迭代器递增一个整数吗?
- 有没有办法生成一个包含平方的序列,这些平方加起来就是一个整数平方?
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 为什么将两个浮点数相加会得到一个整数C++?
- 编写一个读取五个整数并执行一些任务的C++程序
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 我需要编写一个程序来读取一个文件,该文件将输出所有唯一的整数,如果已经看到整数,它将被关闭
- 按升序输出整数时,将最后一个整数放在新行上
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 如何在C++中将一个值拆分为一个十进制整数
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- 将整数范围映射到另一个范围