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&lt;float&gt; 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&lt;std::string&gt; type_vectorparse_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 &gt;&gt; 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' 分隔符行为的主要内容,如果未能解决你的问题,请参考以下文章

int,char,string,三者相互转换(stringstream)

stringstream函数

stringstream用法

stringstream用法

stringstream使用小结

stringstream类的简介和用法