Мне нужно попытаться посмотреть несколько символов из std::istream
(что может быть std::cin
), поэтому я написал простой цикл для вызова get()
много раз, а затем putback()
много времени:
std::vector<char> peek_many(std::istream& is, int N) {
std::vector<char> data;
data.reserve(N);
for (int i = 0; i < N; ++i) {
data.push_back(is.get());
}
for (int i = 0; i < N; ++i) {
is.putback(data[N-i-1]);
}
return data;
}
Это гарантированно сработает на всех istream
s (читаю ли я файл, cin
, istringstream
, так далее)? Если нет, то почему нет?
putback
звонки sputback
который работает только при наличии позиции возврата. Ничто не гарантирует, что таких позиций будет неопределенное количество.
Можно с уверенностью предположить, что 1-символный «широкий» задний буфер помещен обратно. Вам нужно будет добавить дополнительный слой абстракции, чтобы обеспечить больше свободного пространства.
В качестве альтернативы, если ваш поток доступен для поиска, вы можете запомнить позицию, прежде чем начать предварительный анализ, а затем вернуться к запомненной позиции.