因此,list.txt文件的输入文本的格式为:FirstName LastName#Age我的任务是读取上述形式的四行的list.txt文件,并输出年龄最大的名称。我将在下面编写我的解决方案,该解决方案有效,但仅当删除#且输入由空格分隔时才有效。不确定在存在#的情况下该如何做?我知道我可以使用getline(),只是不确定如何?例如:Alpha Beta#22Gama Delta#10输出应该是年龄最大的人的名字,然后是他的年龄。请使我朝着实际正确的解决方案发展。预先感谢您! :)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream ins; // declare an input file stream object
ins.open("list.txt"); // open the file
if (ins.fail()) { // check if there was an error
cout << "Error opening file";
return -1;
}
string maxName; //
int maxAge = 0; //
for (int i = 0; i < 4; i++) { // read four lines from the file
string firstName, lastName;
int age;
ins >> age; // read three variables from the stream line
if (nr > maxAge) { // update the current maximum if greater
maxAge = age;
maxName = firstName + " " + lastName;
}
}
ins.close(); // close the file
cout << " The oldest person is: " << maxName
<< " : " << maxAge << endl;
return 0;
}
这是我给你的代码。请注意,这是CSV(逗号分隔值)的一种实现。
struct Record
{
std::string first_name;
std::string last_name;
unsigned int age; // Ever hear of a negative age?
friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
input >> r.first_name;
std::getline(input, r.last_name, '#');
input >> r.age;
return input;
}
这里是输入循环:
std::vector<Record> database;
Record r;
while (ins >> r)
{
database.push_back(r);
}
由于名字和姓氏之间用空格分隔,因此operator>>
可用于读取名字。
阅读姓氏时使用带有分隔符参数的std::getline
形式。该函数将读取字符,并将其存储到字符串中,直到读取定界符为止。该函数不存储定界符。
由于输入流的位置在'#'之后,因此operator>>
可用于读取年龄。
下一次读取将跳过剩余的换行符(因为它是空格),并读取第二条记录的名字,依此类推。
operator>>
在Record
结构中过载,以增加封装并减少紧密耦合的模块。 Record
不了解其成员,而外部实体则不应。