Нет никаких реальных ограничений на количество символов underflow()
. Единственное реальное ограничение состоит в том, что поток, который не достиг EOF, должен сделать, по крайней мере, один доступный символ. С учетом конкретно std::filebuf
(или std::basic_filebuf<...>
) поток может быть небуферизованным (если был вызван setbuf(0, 0)
), и в этом случае он действительно сделает доступными отдельные символы. В противном случае поток попытается заполнить свой внутренний буфер и будет полагаться на операционную систему, чтобы иметь базовую операцию, возвращая нужное количество байтов, если еще мало доступных.
Я не уверен, что я вполне понимаю ваш вопрос: операция file >> x
вернется после x
полностью прочитать, которое может произойти, если поток указывает file
достиг своей цели или когда символ пробела найден (а если с " строка "вы имеете в виду char*
, также учитывается ненулевое значение, хранящееся в file.width()
). Что касается базового буфера потока, то ясно, что x
может потребовать нескольких считываний в базовое представление, то есть непредсказуемо, сколько звонков на underflow()
. Учитывая, что внутренний буфер файла, вероятно, соответствует размеру блока диска, я ожидал бы, что не более одного вызова underflow()
будет сделано для «нормальных» строк. Однако, если чтение файла является огромным и не содержит пробелов, может быть сделано много вызовов до underflow()
. Учитывая, что потоку необходимо найти пробелы, у него нет способа предсказать, сколько символов требуется в первую очередь.
Я не понимаю Мастер Брюс: D – P0W
Я никогда не изучал, как работает streambuf, и я никогда не планирую. Но если символ ограничителя не найден до того, как буфер исчерпан, не будет ли 'underflow' простозываться снова, чтобы получить больше символов? –
@BenjaminLindley Вот что я понял после того, как написал этот вопрос. – 0x499602D2