При работе с 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;
читает из сети. Я не уверен, что такое поведение соответствует общему договору для потоков. Если бы мне пришлось гадать, то, вероятно, имеет место одно из трех следующих положений:
iostream
ничего не говорится о чередующихся чтениях и записях, или iostream
ничего не говорится о чередующихся чтениях и записях, но в спецификации есть конкретные положения, регулирующие работу стандартных типов, таких как fstream
и stringstream
, илиiostream
действительно говорится что-то о чередующихся чтениях и записях, что делает мой класс сетевого потока нарушающим. У меня есть копия спецификации, но раздел о потоках настолько плотный и загадочный, что следовать ему практически невозможно. Если кто-нибудь может прояснить, как именно iostream
ы должны вести себя, когда вы смешиваете чтение и запись, я был бы очень признателен.