我正在將一些網絡數據作爲input_buffer讀入一個stringstream。只有當它包含任何換行符時,我如何才能從stringstream讀取一行?
數據是由LF字符分隔的ASCII行。
input_buffer可能處於只有部分行的狀態。
我試圖撥打getline()
,但只有實際上是字符串流中的新換行字符。換句話說,它應該提取完整的行,但在緩衝區中留下部分行。
這裏是一個MVCE:
#include <string>
#include <sstream>
#include <iostream>
int
main (void)
{
std::stringstream input_buffer;
input_buffer << "test123\nOK\n";
while (input_buffer.str().find ('\n') != std::string::npos)
{
std::string line;
std::getline (input_buffer, line, '\n');
std::cout << "input_buffer.str().size: " << input_buffer.str().size() << "\n";
std::cout << "line: " << line << "\n";
}
return 0;
}
它目前不會終止,這裏是輸出的片段:
input_buffer.str().size: 11
line: test123
input_buffer.str().size: 11
line: OK
input_buffer.str().size: 11
line:
input_buffer.str().size: 11
...
我怎麼能讀一個字符串流線,只有當它包含任何換行符?
編輯:爲了澄清這裏是另一個代碼示例有部分輸入:
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
void
extract_complete_lines_1 (std::stringstream &input_buffer, std::vector<std::string> &lines)
{
while (input_buffer.str().find ('\n') != std::string::npos)
{
std::string line;
std::getline (input_buffer, line, '\n');
lines.push_back (line);
}
}
void
print_lines (const std::vector<std::string> &v)
{
for (auto l : v)
{
std::cout << l << '\n';
}
}
int
main (void)
{
std::vector<std::string> lines;
std::stringstream input_buffer {"test123\nOK\npartial line"};
extract_complete_lines_1 (input_buffer, lines);
print_lines (lines);
return 0;
}
這應打印「test123」和「OK」,而不是「分線」。
它不會終止,因爲你重複地從字符串的開始搜索。從'input_buffer'中讀取不會改變底層內容。 – molbdnilo
當你已經結束時,'input_buffer.eof()'將成立。 –
[This](http://stackoverflow.com/q/12351163/1460794)可能是相關的。 – wally