Нет более простого способа добраться до конца маркера строки, но вы могли бы сэкономить некоторое время, сохраняя то, что вы читаете, когда вы читаете свои данные. Вам не нужно возвращаться назад, и ваш цикл будет очень быстрым.
Создайте массив символов размером n
и используйте его в качестве кольцевого буфера: когда вы доберетесь до конца массива, просто обведите его обратно. Сохраните символ в следующей позиции вашего кругового буфера.
Когда вы обнаружите '\n'
, ваш буфер содержит n
предшествующие символы, только немного не в порядке: префикс начинается с вашего указателя буфера и заканчивается в конце буфера, а суффикс начинается с нуля и идет на указатель вашего буфера минус один.
Вот пример того, как вы можете заставить его работать (при условии n
== 20):
int main()
{
ifstream fs("c:\\temp\\a.txt");
char buf[20];
int bp = 0;
bool circular = false;
while (fs.good()) {
char ch = fs.get();
if (ch != '\n') {
buf[bp] = ch;
bp = (bp+1) % 20;
circular |= !bp;
} else {
string s;
if (circular) {
s = string(buf+bp, buf+20) + string(buf, buf+bp);
} else {
s = string(buf, buf+bp);
}
cerr << s << endl;
circular = false;
bp = 0;
}
}
return 0;
}