【发布时间】:2012-04-30 07:49:13
【问题描述】:
我有以下函数来读取文本流并将其分割成给定类型的向量:
template<class Type>
void parse_string(std::vector<Type> &type_vector, char *string)
{
std::stringstream stream(string);
while (stream.good())
{
Type t;
stream >> t;
type_vector.push_back(t);
}
}
char *string 参数是表示浮点数或字符串的文本块,每个字符串以' ' 或'\n' 分隔。
现在我的问题是,当给定 std::vector<float> type_vector 时,parse_string 函数将由 ' ' 或 '\n' 分隔符分隔。例如:
0.01 0.02 0.03 0.04
0.05 0.06 0.07 0.08
它将'0.04' 和'0.05' 读取为单独的标记。这就是我想要的!
但是,如果给定 std::vector<std::string> type_vector,parse_string 将仅以 ' ' 分隔。因此,如果我的文字如下:
root_joint left_hip left_knee left_ankle
left_foot right_hip right_knee right_ankle
它将“left_ankleleft_foot”作为单个标记读取。似乎没有考虑到'left_ankle'和'left_foot'之间有一个'\n'。
这是什么原因造成的?
编辑:
在调试器中看到的确切 char* 参数如下:
0.01 0.02 0.03 0.040.05 0.06 0.07 0.08
root_joint left_hip left_knee left_ankleleft_foot right_hip right_knee right_ankle
所以它似乎完全忽略了文件中的 '\n'...
EDIT2:
好的,我知道我做错了什么。正如你们中的许多人所指出的,它与 stringstream 无关。
我的解析器需要文件的 std::vector 副本。在将文件读入字符串并将其转换为向量的过程中,我使用了 getLine(std::ifstream, std::string) 函数,您可以猜到,它会去除 '\n' 换行符。
【问题讨论】:
-
我无法重现您的结果。你能提供一个完整的例子吗?
-
流好并不能保证提取成功(反正我不相信)。我会在循环之外声明
Type t,然后使用while(stream >> t) { }。不过可能与您的问题无关。 -
您确定要传递给函数的数组中实际上有换行符吗?
-
在调试器中查看提供给函数的 char* 字符串时,值之间没有任何内容,例如它将具有 '0.01 0.02 0.03 0.040.05 0.06...' 或浮动点,另一个是 'root_joint left_hip left_knee left_ankleleft_foot right_hip...' 然而,它将浮点值作为单独的实体读取,而不是字符串。这是否与将 0.040.05 解释为 0.040 和 .05 的 >> 运算符有关?
-
好吧,那么错误不在您显示的代码中。在
0.040.05的情况下,operator>> 在第二个点处停止,然后 operator>> 的下一个调用继续在那里。.05是浮点数的有效输入。