Что такое маркер потока и почему в потоке только 1 маркер? - PullRequest
0 голосов
/ 19 сентября 2018

С 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 .

Так какой маркер упоминается в цитате практически ?И почему говорится, что есть только один маркер для потока, который допускает как ввод, так и вывод, что нарушает мое базовое понимание потока?

1 Ответ

0 голосов
/ 19 сентября 2018

Я не эксперт, поэтому просто обоснованное предположение, основанное на моих собственных знаниях:

  1. так называемый маркер является текущим смещением от начала потока, поэтому первый байт равен offset = 0.

  2. Различие между «помещением» и «получением» позволяет пользователю реализовывать свои собственные классы потока, которыеиспользует разные g и p, таким образом, не опираясь на один маркер для чтения / записи, этот подход обеспечивает большую гибкость, поскольку вы не привязаны к одному маркеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...