2013-10-27 7 views
0

Скажем, у меня есть операции ввода:Как буфер знает, сколько символов нужно перенести из внешнего файла во время операции очистки?

file >> x; 

Если внутренний буфер file пуст underflow() будет называться импортировать персонажей из внешнего устройства во внутренний буфер file. Он определяется реализацией, если буфер будет частично или полностью заполнен после этой операции промывки. Принимая это во внимание, возможно ли, что если x является строкой, и я ожидаю входное значение определенной длины, что буфер имеет право передавать меньшее количество символов, чем это? Может ли это случиться?

+0

Я не понимаю Мастер Брюс: D – P0W

+0

Я никогда не изучал, как работает streambuf, и я никогда не планирую. Но если символ ограничителя не найден до того, как буфер исчерпан, не будет ли 'underflow' простозываться снова, чтобы получить больше символов? –

+0

@BenjaminLindley Вот что я понял после того, как написал этот вопрос. – 0x499602D2

ответ

2

Нет никаких реальных ограничений на количество символов underflow(). Единственное реальное ограничение состоит в том, что поток, который не достиг EOF, должен сделать, по крайней мере, один доступный символ. С учетом конкретно std::filebuf (или std::basic_filebuf<...>) поток может быть небуферизованным (если был вызван setbuf(0, 0)), и в этом случае он действительно сделает доступными отдельные символы. В противном случае поток попытается заполнить свой внутренний буфер и будет полагаться на операционную систему, чтобы иметь базовую операцию, возвращая нужное количество байтов, если еще мало доступных.

Я не уверен, что я вполне понимаю ваш вопрос: операция file >> x вернется после x полностью прочитать, которое может произойти, если поток указывает file достиг своей цели или когда символ пробела найден (а если с " строка "вы имеете в виду char*, также учитывается ненулевое значение, хранящееся в file.width()). Что касается базового буфера потока, то ясно, что x может потребовать нескольких считываний в базовое представление, то есть непредсказуемо, сколько звонков на underflow(). Учитывая, что внутренний буфер файла, вероятно, соответствует размеру блока диска, я ожидал бы, что не более одного вызова underflow() будет сделано для «нормальных» строк. Однако, если чтение файла является огромным и не содержит пробелов, может быть сделано много вызовов до underflow(). Учитывая, что потоку необходимо найти пробелы, у него нет способа предсказать, сколько символов требуется в первую очередь.