如果流包含意外内容、提前结束或未完全消耗,如何编写一个读取 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;
}
关于c++ - 如何编写 `std::istream` 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31078235/