С C ++ Primer 5th (выделено мое):
Есть только один маркер Тот факт, что библиотека различает «ставить» и«Получение» версий функций seek
и tell
может вводить в заблуждение.Несмотря на то, что библиотека делает это различие, она поддерживает только один маркер в потоке - нет отдельного маркера чтения и маркера записи .
Когда мы имеем дело с вводом -только или выходной поток, различие даже не очевидно.В таких потоках можно использовать только версии g
или только версии p
.Если мы попытаемся вызвать tellp
на ifstream
, компилятор будет жаловаться.Аналогично, он не позволит нам вызывать seekg
для ostringstream
.
Типы fstream
и stringstream
могут читать и записывать один и тот же поток. В этих типах есть один буфер, который содержит данные для чтения и записи, и один маркер, обозначающий текущую позицию в буфере. Библиотека отображает позиции g
и p
на этот единственныймаркер.Поскольку существует только один маркер, мы должны искать его, когда мы переключаемся между чтением и записью.
Все, что я знаю о потоковом буфере, это с этой страницы https://en.cppreference.com/w/cpp/io/basic_streambuf. Из текста и диаграммы я знаю, что поток - это источник, содержащий данные, которые могут содержать не более 2 буферов, поддерживаемых указателями 6 .
Так какой маркер упоминается в цитате практически ?И почему говорится, что есть только один маркер для потока, который допускает как ввод, так и вывод, что нарушает мое базовое понимание потока?