stringstream >> 不一致的 '\n' 分隔符行为
Posted
技术标签:
【中文标题】stringstream >> 不一致的 \'\\n\' 分隔符行为【英文标题】:stringstream >> inconsistent '\n' delimiter behaviourstringstream >> 不一致的 '\n' 分隔符行为 【发布时间】: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
是浮点数的有效输入。
【参考方案1】:
您正在错误地读取字符串,因此 \n 被丢弃。 \n 应该会导致分裂。
【讨论】:
以上是关于stringstream >> 不一致的 '\n' 分隔符行为的主要内容,如果未能解决你的问题,请参考以下文章