У меня есть следующая структура:
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;
}
Еще одна вещь, которую следует рассмотреть, прежде чем сказать, что я должен написать отдельные функции, задача состоит в том, чтобы написать одну функцию для чтения как имени, так и адреса.
Ты можешь использовать 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;
Просто прочитайте слово, пропустите первые пробелы, а затем прочитайте разделитель:
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'
быть по умолчанию.