【问题标题】:Reading from the Istream, how to first read one word then an entire line, and return it?从 Istream 中读取,如何先读取一个单词,然后读取整行,然后返回?
【发布时间】:2015-04-11 20:41:07
【问题描述】:

我有以下结构:

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

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

在说我应该编写单独的函数之前要考虑的另一件事,任务是编写一个函数来读取名称和地址。

【问题讨论】:

  • std::getline(is, person.address)。但是,cin.ignore(std::numeric_limits<std::streamsize>::max, '\n') 如果您要混合使用 operator>>std::getline
  • @remyabel 我想了解ignore 的动机是什么?

标签: c++ stream getline istream extraction-operator


【解决方案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;

【讨论】:

    【解决方案2】:

    只需读取一个单词,跳过前导空格,然后读取到分隔符:

    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' 是默认值。

    【讨论】:

    • 如果我使用上面的。当我输入 return 'is' 时,getline 的输入是否也会被函数返回?抱歉,如果这是一个基本问题,我在理解 iostreams 的工作原理时遇到了一些麻烦。
    • @WalidBeydoun 将is 视为一个带有插入符号的字符串,告诉流它的当前位置。此代码将更新插入符号位置。返回 is 是链接运算符的关键,但在您的 read 函数中不是必需的,但我的 operator&gt;&gt; 必须返回 std::istream&amp; 以便您可以执行以下操作:foo &gt;&gt; person1 &gt;&gt; person2 &gt;&gt; person3; 每个运算符都使用从前一个运算符。
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多