跟进https://stackoverflow.com/a/1120224/390066。
为什么我不能使用
getline(stringstream(line),cell,','){}
而不是
stringstream lineStream(line);
getline(lineStream,cell,','){}
更新
我应该澄清一点,我想在循环中使用getline。
此外,我还应该注意到我的初衷是使用getline逐行读取文件并使用新getline中的行,该行将分为',',这更直观imo。
从我到目前为止所理解的,getline并不是为此设计的,因为它需要一个非const输入并给出const令牌;因此,getline不能盲目递归。
答案 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(), ',' ) );
效率更高一点。并且,至少在我看来,更容易阅读和 维护。