Какие гарантии существуют на чередующиеся чтения и записи?

При работе с C++ std::iostream (например, std::fstream или std::stringstream, гарантирует ли стандарт что-либо о взаимоотношениях между чтениями и записями, выполняемыми в одном и том же потоке? То есть, обязательно ли верно, что если я записываю данные в std::fstream, а затем пытаюсь прочитать данные из этого потока, то я должен увидеть записанные данные? А как насчет std::stringstream? Как пример, гарантированно ли это работает?

std::stringstream myStream;
myStream << "137 Hello 2.71828";

int myInt;
std::string myString;
double myDouble;

myStream >> myInt >> myString >> myDouble; // Parse as expected?

Или как насчет этого случая?

std::fstream myStream("some-file.txt", ios::in | ios::out);
myStream << "137 Hello 2.71828";

int myInt;
std::string myString;
double myDouble;

myStream >> myInt >> myString >> myDouble; // Parse as expected?

Я спрашиваю, потому что недавно я разработал класс сетевого потока, в котором чтение и запись не влияют друг на друга (поскольку чтение тянет из сети, а запись отправляет по сети). То есть write

myNetworkStream << "Hi there!" << endl;

пишет по сети, а read

myNetworkStream >> myValue;

читает из сети. Я не уверен, что такое поведение соответствует общему договору для потоков. Если бы мне пришлось гадать, то, вероятно, имеет место одно из трех следующих положений:

  1. В контракте iostream ничего не говорится о чередующихся чтениях и записях, или
  2. В общем контракте iostream ничего не говорится о чередующихся чтениях и записях, но в спецификации есть конкретные положения, регулирующие работу стандартных типов, таких как fstream и stringstream, или
  3. В контракте iostream действительно говорится что-то о чередующихся чтениях и записях, что делает мой класс сетевого потока нарушающим.

У меня есть копия спецификации, но раздел о потоках настолько плотный и загадочный, что следовать ему практически невозможно. Если кто-нибудь может прояснить, как именно iostreamы должны вести себя, когда вы смешиваете чтение и запись, я был бы очень признателен.

11
задан GEOCHET 7 August 2015 в 14:37
поделиться