c++ - 从 Istream 读取,如何先读一个字再读一整行,然后返回?

标签 c++ stream getline istream extraction-operator

我有以下结构:

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 获取超过一个单词。例如,如果输入是:

Lee Goswell Road

输出将是 person.name = "Lee"和 person.address = "Goswell"。我想要的是基本上读取整个地址的功能。我确实尝试按如下方式解决此问题,但我不确定它是否正确,因为地址已隐式更改:

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;

关于c++ - 从 Istream 读取,如何先读一个字再读一整行,然后返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28454992/

相关文章:

c++ - std 没有成员 'getline' ?

c++ - std::getline 部分读取第一行和最后一行并设置 eof 位

javascript - 将 EXIF 数据写入图像流 Node.js

python - 对于 Project Euler,C++ 似乎比 Python Ruby 慢得多

c++ - GLEW + cmake 链接失败 "undefined reference to symbol glDrawElements"+ "DSO missing from command line"

c++ - 是否所有类都有编译器为它们创建的 Vtable?

node.js - 如何使套接字成为流?在 imagemagick 之后将 https 响应连接到 S3

java - Android Studio - 如何从文本文件中读取(行)?

c++ - 从文本文件读取时使用 getline

c++ - C++ 函数参数中的求值顺序