为什么getline这么奇怪?

时间:2018-11-28 23:38:11

标签: c++ getline

我不了解C ++ getline函数背后的设计决策。

为什么要通过引用将流和字符串作为参数,而只返回传入的相同流?似乎仅将流作为参数,然后返回已读取的字符串似乎更直观。返回相同的流可让您链接呼叫,但是真的有人愿意使用getline(getline(stream, x), y)吗?

此外,为什么函数不像其他标准库那样位于std命名空间中?

2 个答案:

答案 0 :(得分:4)

如果该函数返回一个字符串,则将无法指示读取失败,因为所有字符串值都是此(或任何其他)函数可以返回的有效值。另一方面,流中有许多错误指示标志,可以由调用getline的代码进行测试。因此人们可以编写如下代码:

 while( std::getline( std::cin, somestring )) {
     // do stuff with somestring
 }

如果getline返回一个字符串,很难看到如何编写类似的代码。

  

为什么函数不像其他标准库那样位于std名称空间中?

它在std命名空间中-是什么让您觉得不一样?

答案 1 :(得分:3)

  

为什么要通过引用将流和字符串作为参数,而只返回传入的相同流?

这是流库中的常见模式。这意味着您可以在执行操作时测试正在执行的操作。例如:

std::string line;
while(std::getline(std::cin, line))
{
    // use line here because we know the read succeeded
}

您还可以通过“链接”流函数来进行简洁的解析器:

std :: string键,值;

if(std::getline(std::getline(in, key, '='), value))
    my_map[key] = value;
  

仅将流作为参数,然后返回已读取的字符串,这似乎更直观。

每次调用都返回一个新字符串的问题是,您不断为其分配新的内存,而不是重用已分配给传入的字符串或在循环中获得的字符串的内存。

// Here line will not need to allocate memory every time
// through the loop. Only when it finds a longer line than
// it has capacity for:

std::string line;
while(std::getline(std::cin, line))
{
    // use line here because we know the read succeeded
}