【发布时间】:2012-10-06 18:59:17
【问题描述】:
我有一个包含整数和特殊含义字符“#”的输入流。它看起来如下:
... 12 18 16 # 22 24 26 15 # 17 # 32 35 33 ...
标记由空格分隔。 '#' 的位置没有模式。
我试图像这样标记输入流:
int value;
std::ifstream input("data");
if (input.good()) {
string line;
while(getline(data, line) != EOF) {
if (!line.empty()) {
sstream ss(line);
while (ss >> value) {
//process value ...
}
}
}
}
此代码的问题是遇到第一个“#”时处理停止。
我能想到的唯一解决方案是将每个单独的标记提取成一个字符串(不是'#')并使用 atoi() 函数将字符串转换为整数。但是,由于大多数令牌是整数,因此效率非常低。在令牌上调用 atoi() 会带来很大的开销。
有没有办法可以按类型解析单个令牌?即,对于整数,将其解析为整数,而对于'#',跳过它。谢谢!
【问题讨论】:
-
使用 getline 两次可以接受吗?如果是这样,请使用
getline( data, line, '#');fisrt。 -
@ahenderson 我没明白你的意思。 getline 的函数签名之一是: istream& getline ( istream& is, string& str, char delim );通过将 '#' 作为第三个参数传递给 getline,getline() 将使用 '#' 作为分隔符。