Читая из Istream, как сначала прочитать одно слово, затем целую строку и вернуть его?

У меня есть следующая структура:

struct Person{
std::string name;
std::string address;

std::string& personName(){ return name; }
std::string& personAddress(){return address;}
};

Упражнение заключается в написании функции чтения, которая будет читать имя и адрес. Например, функция, которую я впервые написал, была такой:

std::istream &read(std::istream &is, Person &person){
is >> person.name >> person.address;
return is;
}

Однако эта функция не может занять больше слова для address, Например, если ввод:

Ли Госуэлл-роуд

Выход будет person.name = «Ли» и person.address = «Госуэлл». То, что я хочу, это функция, чтобы прочитать весь адрес в основном. Я попытался решить эту проблему следующим образом, но я не уверен, что это правильно, потому что адрес изменяется неявно:

std::istream &read(std::istream &is, Person &person){
is >> person.name;
std::getline(std::cin, person.address);
return is;
}

Еще одна вещь, которую следует рассмотреть, прежде чем сказать, что я должен написать отдельные функции, задача состоит в том, чтобы написать одну функцию для чтения как имени, так и адреса.

1

Решение

Ты можешь использовать operator>> В паре с std::getline но вы, вероятно, захотите сначала съесть пробел из потока.

Также, а не read, вы должны просто создать свой собственный operator>>:

std::istream& operator>>(std::istream& is, Person& person){
is >> person.name >> std::ws;
std::getline(is, person.address);
return is;
}

Затем вы можете использовать это следующим образом:

std::istringstream foo("Lee Goswell Road\nJon Lois Lane");
Person bar;

foo >> bar;

std::cout << bar.name << std::endl << bar.address << std::endl;
0

Другие решения

Просто прочитайте слово, пропустите первые пробелы, а затем прочитайте разделитель:

if (is >> person.name >> std::ws
std::getline(is, person.address)) {
// do something with the input
}
else {
// deal with input failure
}

std::ws просто пропускает ведущие пробелы и std::getline() читает с разделителем '\n' быть по умолчанию.

0

По вопросам рекламы [email protected]