问题
If I have the data look like this:
Michael 30
Tom 35
I can handle it by the following code:
#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;
}
However if my data looks like this:
Michael Corleone
30
Tom Hagen
35
I tried using this code, but it only read the first line, the logic seems that it should read all the lines, so I don't know why this attempt fails.
#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;
}
Even worse, if my data look like this:
Michael Corleone 30
Tom Hagen 35
Follow the suggestion by one of the answers, I can have a workaround by splitting the name into name1 and 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;
}
However, this is not nice, what if someone have a middle name for example?
回答1:
Looking at the second example with this data:
Michael Corleone
30
Tom Hagen
35
The problem is that after reading the age with std::cin >> age the end-of-line character is still left in the stream so the following std::getline gets nothing because it thinks the line is empty (which it is).
The trick is to skip whitespace before reading each new record:
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;
}
Or, more succinctly:
std::string name;
int age;
while(std::getline(std::cin >> std::ws, name) >> age) {
    std::cout << name << " is " << age << " years old." << std::endl;
}
    回答2:
How about this?
#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;
    }
    来源:https://stackoverflow.com/questions/39881604/how-to-read-names-with-space