如何在getline中使用stringstream构造函数?

时间:2014-11-17 18:06:12

标签: c++ stream getline default-constructor

跟进https://stackoverflow.com/a/1120224/390066

为什么我不能使用

getline(stringstream(line),cell,','){}

而不是

stringstream lineStream(line); 
getline(lineStream,cell,','){}

更新

我应该澄清一点,我想在循环中使用getline。

此外,我还应该注意到我的初衷是使用getline逐行读取文件并使用新getline中的行,该行将分为',',这更直观imo。

从我到目前为止所理解的,getline并不是为此设计的,因为它需要一个非const输入并给出const令牌;因此,getline不能盲目递归。

2 个答案:

答案 0 :(得分:3)

如@James Kanze所示,你可以。

问题是你真的想要吗? 在表达式结束时,流被销毁,因此您只能从中读取一个单元格。

如果我们在context of the original question中看到这一点: 即你不能在循环中使用它:

std::string       line = /* Init */;
std::stringstream lineStream(line); 

std::string cell;
while(std::getline(lineStream, cell, ','))
{
    // Do stuff with cell.
}

如果您将代码置于此上下文中,它将无法按预期工作:

std::string cell;
while(std::getline(std::istringstream(line).flush(), cell, ','))
{
    // Do stuff with cell.
}

由于每次都会对while()内的表达式进行全面评估。所以你进入一个infinte循环连续读取第一个细胞。

答案 1 :(得分:1)

你可以,但它很难看:

std::getline( std::istringstream( line ).flush(), cell, ',' );

问题是std::getline采用非const引用(即 逻辑,因为它将修改流),你不能 使用临时初始化非const引用。但是,你可以 呼叫成员函数就可以了。 std::istream::flush是会员 function,它返回一个非const引用,指向它所在的流 被调用(如果该流是std::istringstream,则不会 其他任何事情)。

FWIW:您可能会找到:

cell = std::string( line.cbegin(), std::find( line.cbegin(), line.cend(), ',' ) );

效率更高一点。并且,至少在我看来,更容易阅读和 维护。