如果我的数据如下所示:
Michael 30
Tom 35
我可以通过以下代码处理它:
#include <iostream>
#include <string>
int main() {
std::string name;
int age;
while(std::cin >> name >> age) {
std::cout << name << " is " << age << " years old." << std::endl;
}
return 0;
}
但是,如果我的数据如下:
Michael Corleone
30
Tom Hagen
35
我尝试使用此代码,但它只读取第一行,逻辑似乎应该读取所有行,所以我不知道为什么这次尝试失败。
#include <iostream>
#include <string>
int main() {
std::string name;
int age;
while(std::getline(std::cin, name) && std::cin >> age) {
std::cout << name << " is " << age << " years old." << std::endl;
}
return 0;
}
更糟糕的是,如果我的数据如下所示:
Michael Corleone 30
Tom Hagen 35
按照其中一个答案的建议,我可以通过将名称分为name1
和name2
来解决方法:
int main() {
std::string name1, name2;
int age;
while(std::cin >> name1 >> name2 >> age) {
std::cout << name1 + ' ' + name2
<< " is " << age << " years old." << std::endl;
}
return 0;
}
然而,这不好,如果某人有中间名怎么办?
答案 0 :(得分:3)
查看这个数据的第二个例子:
Michael Corleone
30
Tom Hagen
35
问题是,在用age
阅读std::cin >> age
之后,行尾字符仍留在流中,因此以下std::getline
没有任何结果,因为它认为该行是空的(它是)。
诀窍是在读取每条新记录之前跳过空格:
std::string name;
int age;
while(std::cin >> std::ws && std::getline(std::cin, name) && std::cin >> age) {
std::cout << name << " is " << age << " years old." << std::endl;
}
或者,更简洁:
std::string name;
int age;
while(std::getline(std::cin >> std::ws, name) >> age) {
std::cout << name << " is " << age << " years old." << std::endl;
}
答案 1 :(得分:-3)
这个怎么样?
#include <iostream>
#include <string>
int main() {
std::string firstname;
std::string lastname;
int age;
while(true){
std::cin >> firstname;
std::cin >> lastname;
std::cin >> age);
std::cout << firstname << " " << lastname << " is " << age << " years old." << std::endl;
}
return 0;
}