从字符串中获取最后一行

时间:2019-03-04 09:41:44

标签: c++ string

我目前已经实现了此逻辑,以从字符串中获取最后一行。我确信这不是有效的解决方案。

...
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()。

1 个答案:

答案 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函数,可能那里有一些不错的技巧,但应该可以。

一种改进可能是在位置减小时访问前面的某个块,以便将几个数据块预加载到缓存中。如果这产生了很大的影响甚至是必要的,则不确定如何理想地进行,也许其他人可以详细说明。如果最后一行很小的假设成立,就没有必要。