"cin >> x" не использует символ новой строки из входного потока, поэтому следующая строка, которую вы получите с помощью getline, будет содержать пустую строку.Одним из способов решения этой проблемы является использование getline для извлечения входных данных построчно и использование stringstream для токенизации каждой строки.После того, как вы извлекли весь ввод из строкового потока, ключевым моментом является вызов stringstream :: clear (), чтобы очистить флаг EOF, установленный для строкового потока, чтобы иметь возможность использовать его позже в коде.
Вотпример:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
string line;
stringstream ss;
getline(cin, line);
ss << line;
int x, y, z;
//extract x, y, z and any overflow characters
ss >> x >> y >> z >> line;
ss.clear();
//reuse ss after clearing the eof flag
getline(cin, line);
ss << line;
//extract new fields, then clear, then reuse
//...
return 0;
}
В зависимости от длины каждой строки ввода, получение всей строки за раз и обработка ее в памяти, вероятно, более эффективны, чем выполнение консольного ввода-вывода для каждого токена, из которого вы хотите извлечьстандартный ввод.