Нет более простого способа добраться до конца маркера линии, но вы могли бы сэкономить некоторое время, сохранив то, что вы читали при чтении своих данных. Вам не нужно будет возвращаться, и ваш цикл будет очень быстрым.
Создайте массив символов размером 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;
}
Короткий ответ: Нет – EricSchaefer
ли вы попробовать GetLine() ? – jsimpson
Настоящий ответ: это зависит. – Fanael