如何在 getline 中使用字符串流构造函数
How to use stringstream constructor in getline?
跟进 https://stackoverflow.com/a/1120224/390066。
为什么我不能使用
getline(stringstream(line),cell,','){}
而不是
stringstream lineStream(line);
getline(lineStream,cell,','){}
?
更新
我应该澄清我想在循环中使用 getline。
此外,我还应该注意到,我的最初意图是使用 getline 逐行读取文件,并使用新 getline 中的行,该行将划分为",",这更直观。
根据我目前的理解,getline 不是为此而设计的,因为它接受非常量输入并给出常量令牌;因此,getline 不能盲目递归。
正如@James Kanze所示,你可以。
问题是你真的想要吗?
流在表达式结束时被销毁,因此您只从中读取一个单元格。
如果我们在原始问题的上下文中看这个问题:
即您不能在循环中使用它:
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()
内的表达式每次都会被完全计算。所以你进入一个无限循环,连续读取第一个单元格。
你可以,但它很丑陋:
std::getline( std::istringstream( line ).flush(), cell, ',' );
问题是std::getline
采用非常量引用(即合乎逻辑,因为它将修改流),并且您不能使用临时引用初始化非常量引用。 但是,您可以,在其上调用成员函数。 std::istream::flush
是会员函数,它返回对它所基于的流的非常量引用被调用(如果该流是std::istringstream
,则不做其他任何东西)。
FWIW:你可能会发现:
cell = std::string( line.cbegin(), std::find( line.cbegin(), line.cend(), ',' ) );
效率更高一点。 而且,至少在我看来,更容易阅读和保持。
相关文章:
- 在c++构造函数中使用随机字符串生成器
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- C 字符串在显式构造函数中分配值C++?
- 我用字符串做了一个C++构造函数,但它不会打印出字符串
- C++继承:构造函数中的字符串构造
- 在派生自线程类的构造函数中传递字符串
- 性能 - 使用字符串构造函数与使用串联
- 字符串构造函数将两个字符* 放入另一个 std::string 在 C++14 中有效,但不适用于 C++17
- 调用哪个字符串构造函数
- 使用子字符串构造函数构建字符串 - 调试 - 当自动跳过代码时
- 使用字符串构造函数从wstring转换为字符串时,是否没有可能的数据丢失
- 不分配任何字符内存的常量字符串构造函数?
- 常量 char* 的字符串构造函数更改常量 char* 的值
- 为什么从std::string的initializer列表中填充std::向量不会调用std::字符串构造函数
- 为什么 C++03 文件流不接受字符串构造函数参数?
- 带有char*内存泄漏的字符串构造函数
- BigNum类字符串构造函数错误
- CPP字符串构造函数查找并附加空字符
- c++的字符串构造函数
- c++ std::复制结果不同于字符串构造函数