c++ - 如何编写 `std::istream` 运算符

标签 c++ parsing stream

如果流包含意外内容、提前结束或未完全消耗,如何编写一个读取 std::istream 并设置适当标志的函数?

具体而言,假设我希望流包含一串字母字符,后跟分隔符,然后是一些数字,例如 foo:55。我想读一些类似的内容

struct var {
  std::string name;
  double value;
};

来自流。我当然可以将运算符写为

std::istream& operator>>(std::istream& s, var& x) {
  std::string str;
  s >> str;
  size_t sep = str.find(':');
  x.name  = str.substr(0,sep);
  x.value = atof(str.substr(sep+1).c_str());
  return s;
}

但是我可以不将流内容复制到字符串中吗?此外,这不适用于空格,因为 str 不会包含整个流内容。

我问了类似的question大约一周前,但没有回应,可能是因为我将其放在 boost::program_options 的上下文中,而此类问题在这里似乎没有得到太多关注。

最佳答案

可以使用std::getline代替s >> str读取最多':',然后读取数字直接进入 double,如下所示:

std::istream& operator>>(std::istream& s, var& x) {
    // Skip over the leading whitespace
    while (s.peek() == '\n' || s.peek() == ' ') {
        s.get();
    }
    std::getline(s, x.name, ':');
    s >> x.value;
    return s;
}

Demo.

关于c++ - 如何编写 `std::istream` 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31078235/

相关文章:

c++ - C++串口问题

C++ - 几个与 Boost.Asio 相关的问题

python-3.x - 将 panda 数据框列从字典数据形式解析为每个字典键的新列

Java:如何从 HTML 标签中剥离文本内容?

c# - 流式传输为 UTF8 字符串,不带 byte[]

c++ - 类/成员函数错误

c++ - 在内存中复制字节时,字节顺序是否有影响?

java - 关于在运行时执行/解析自定义方法的建议 - Java

javascript - Node.js Http 服务器,readstream 结束事件触发 console.log 两次

c# - C# WebApi 中的实时 FLV 流式传输