我目前已经实现了此逻辑,以从字符串中获取最后一行。我确信这不是有效的解决方案。
...
string response;
while (1) {
string newResponse = SocketRead();
response += newResponse;
if(checkIfReceiveComplete(response)) {
break;
}
}
...
bool checkIfReceiveComplete(string &response) {
size_t index = response.find_last_of("\r\n");
if (response+ 1 == response.length()) {
response.pop_back();
response.pop_back();
index = response.find_last_of("\r\n");
}
string lastLine = response.substr(index + 1);
return (lastLine.find(" OK ") != string::npos);
}
请让我知道可以有效地实现这一点。
注意:我不是从文件中读取。因此,我不确定是否可以使用seekg()。
答案 0 :(得分:1)
std::string
在内部存储char*
,该inline bool is_return(const char& input)
{
return input == '\n' || input == '\r';
}
string last_line (const string& input)
{
if(input.length() == 1) return input;
size_t position = input.length()-2; // last character might be a return character, we can jump over it anyway
while((not is_return(input[position])) and position > 0) position--;
// now we are at the \n just before the last line, or at the first character of the string
if(is_return(input[position])) position += 1;
// now we are at the beginning of the last line
return input.substr(position);
}
在空间上是连续的,因此易于访问。我们可以使用它从后面搜索最后一个(或倒数第二个)返回字符:
@Value
此代码假定输入实际上很大,而输出(/最后一行的大小)不是很大。不使用任何特殊的STL函数,可能那里有一些不错的技巧,但应该可以。
一种改进可能是在位置减小时访问前面的某个块,以便将几个数据块预加载到缓存中。如果这产生了很大的影响甚至是必要的,则不确定如何理想地进行,也许其他人可以详细说明。如果最后一行很小的假设成立,就没有必要。