【问题标题】:Obtaining start position of istringstream token获取字符串流令牌的起始位置
【发布时间】:2022-01-07 16:50:38
【问题描述】:

有没有办法找到istringstream::operator >>提取的token的起始位置?

例如,我当前检查tellg() (run online) 的尝试失败:

string test = "   first     \"  in \\\"quotes \"  last";
istringstream strm(test);

while (!strm.eof()) {

    string token;
    auto startpos = strm.tellg();
    strm >> quoted(token);
    auto endpos = strm.tellg();
    if (endpos == -1) endpos = test.length();

    cout << token << ": " << startpos << " " << endpos << endl;

}

所以上面程序的输出是:

first: 0 8
  in "quotes : 8 29
last: 29 35

结束位置很好,但开始位置是通向标记的空白的开始。我想要的输出是这样的:

first: 3 8
  in "quotes : 13 29
last: 31 35

这是带有位置的测试字符串供参考:

          1111111111222222222233333
01234567890123456789012345678901234  the end is -1

   first     "  in \"quotes "  last

        ^--------------------^-----^ the end positions i get and want
^-------^--------------------^------ the start positions i get
   ^---------^-----------------^---- the start positions i *want*

在使用istringstream时,是否有任何直接的方法可以检索此信息?

【问题讨论】:

  • 请澄清...您提供了程序的示例输出,然后显示了您希望看到的输出示例,与第一个示例相同。
  • @paddy 啊,编辑造成的附带损害。感谢您发现这一点。一瞬间....固定。对此感到抱歉。

标签: c++ parsing c++17 istringstream


【解决方案1】:

首先,见Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?

其次,您可以使用std::ws 流操作符在读取下一个token 值之前吞下空格,然后tellg() 将报告您要查找的起始位置,例如:

#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

...

string test = "   first     \"  in \\\"quotes \"  last";
istringstream strm(test);

while (strm >> ws) {

    string token;
    auto startpos = strm.tellg();
    if (!(strm >> quoted(token)) break;
    auto endpos = strm.tellg();
    if (endpos == -1) endpos = test.length();

    cout << token << ": " << startpos << " " << endpos << endl;
}

Online Demo

【讨论】:

  • 完美。谢谢。我想这将是一个轻松的工作。我只是太着急了,无法弄清楚。
  • @JasonC 更新以处理该故障
  • 我可以发誓有一个&gt;&gt; 来获取当前位置;那会让一切顺利的。我可能会记住其他语言,或者我在想scanf。一秒钟,让我们看看....
  • @JasonC not that I see。也许你在想std::showpos?但这是出于完全不同的目的。是的,scanf() 有 %n。不过,创建一个自定义流操纵器来输出流的当前位置应该不难。
  • 我真的很高兴看到你最后的评论慢慢演变,顺便说一句。我记得当它只是一个年轻的“不”。啊,怀旧。 5 分钟前…… 仿佛就在昨天。时间肯定会飞逝。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2011-12-07
  • 2012-11-23
  • 1970-01-01
  • 2021-10-19
  • 2018-06-05
相关资源
最近更新 更多