【发布时间】:2014-11-28 03:17:48
【问题描述】:
我正在尝试从使用 \0 来分隔数据片段和 \n 来分隔行的套接字中读取一个大缓冲区。
我认为 getline() 是获取每一行的简单方法,但它的行为很奇怪。
我在 getline() 中使用 \n 作为分隔符。
string line;
string test1 = "aaa,123\nbbb\nccc,456\n";
stringstream ss1(test1);
while(std::getline(ss1, line, '\n')) {
cout << line << endl;
}
// outputs:
// aaa,123
// bbb
// ccc,456
string test2 = "aaa\0123\0\nbbb\0\nccc\0456\0\n";
stringstream ss2(test2);
while(std::getline(ss2, line, '\n')) {
cout << line << endl;
}
// outputs:
// aaa
// 3
为什么在 test2 中会发生这种情况? 3从哪里来?我必须删除 \0 才能完成这项工作吗?当我执行套接字 recv() 时,是否有更简单/更好的方法来标记缓冲区中的字符串?
【问题讨论】:
-
为什么来自套接字的数据首先在行中有空值?如果它应该是文本,则不应嵌入空值。
-
哦,我知道 3 是从哪里来的。第一个
\0不是空值,它是\012的开头,它是一个回车符。然后是 3。 -
是换行,不是回车。 CR 是
\015。 LF 也是 C 换行符。
标签: c++ sockets getline stringstream