From 713e693f918618e86509cc2145c704c912afa8a5 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 21 Feb 2011 22:44:18 +0100 Subject: [PATCH] Fix O(n^2) behavior in ReadLinesFromFile(). --- Client Applications/rcracki_mt/Public.cpp | 26 +++++++++++------------ Client Applications/rcracki_mt/Public.h | 2 ++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Client Applications/rcracki_mt/Public.cpp b/Client Applications/rcracki_mt/Public.cpp index 6e02af6..5e041cf 100644 --- a/Client Applications/rcracki_mt/Public.cpp +++ b/Client Applications/rcracki_mt/Public.cpp @@ -153,8 +153,9 @@ string TrimString(string s) while (s.size() > 0) { - if (s[s.size() - 1] == ' ' || s[s.size() - 1] == '\t') - s = s.substr(0, s.size() - 1); + if (s[s.size() - 1] == ' ' || s[s.size() - 1] == '\t' || + s[s.size() - 1] == '\r' || s[s.size() - 1] == '\n') + s.resize(s.size() - 1); else break; } @@ -250,21 +251,20 @@ bool ReadLinesFromFile(string sPathName, vector& vLine) content += "\n"; delete [] data; - unsigned int i; - for (i = 0; i < content.size(); i++) - { - if (content[i] == '\r') - content[i] = '\n'; - } + string::iterator n = content.begin(); + string::iterator line_end; + for ( ;; ) { + line_end = find(n, content.end(), '\n'); - string::size_type n; - while ((n = content.find("\n", 0)) != string::npos) - { - string line = content.substr(0, n); + string line(n, line_end); line = TrimString(line); if (line != "") vLine.push_back(line); - content = content.substr(n + 1); + + if (line_end == content.end()) { + break; + } + n = line_end + 1; } fclose(file); diff --git a/Client Applications/rcracki_mt/Public.h b/Client Applications/rcracki_mt/Public.h index 08943d4..2241cbf 100644 --- a/Client Applications/rcracki_mt/Public.h +++ b/Client Applications/rcracki_mt/Public.h @@ -28,9 +28,11 @@ #include #include +#include #include #include #include +#include #include "global.h" -- 2.39.2