У меня есть открытый текстовый файл с курсором в определенной позиции. Мне нужно найти номер строки курсора. Какой из следующих подходов является лучшим с точки зрения производительности?
1) Сохраните текущую позицию в переменной «pos» и найдите все символы «\ n» от начала файла до «pos».
ifstream in("file.txt");
// move anywhere in the file
int lineNum = 0;
std::string line;
istream::pos_type pos = in.tellg();
in.seekg(0);
while ( std::getline(in, line) ) {
++lineNum;
if(in.tellg() >= pos) break;
}
2) Сделайте то же самое, используя отдельный ifstream.
3) Что-нибудь еще?
С точки зрения производительности, может быть, лучше не использовать потоки и просто прочитать весь файл от начала до текущей позиции в одну большую строку (используя, например, fread) и посчитать вхождения разделителя новой строки из результирующей строки в памяти ,
API — отличное место, чтобы помочь
От: http://www.cplusplus.com/reference/istream/istream/getline/
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
Get line Извлекает символы из потока как неформатированный ввод и сохраняет их в s как c-строку, пока либо извлеченный символ не станет символом-разделителем, либо n символов не будет записано в s (включая завершающий нулевой символ).
Символ-разделитель — это символ новой строки (‘\ n’) для первой формы и разделитель для второй: найденный во входной последовательности, он извлекается из входной последовательности, но отбрасывается и не записывается в s.
Таким образом, лучшим способом было бы просто выполнить итерацию цикла while и увеличить счетчик. Вам не нужно искать новую строку, так как функция делает это за вас.