При работе с 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?
Я спрашиваю, потому что недавно я разработал класс сетевого потока, в котором операции чтения и записи не влияют друг на друга (поскольку операции чтения извлекаются из сети и записи отправляются через сеть). То есть писать
myNetworkStream << "Hi there!" << endl;
пишет по сети, а
myNetworkStream >> myValue;
читает из сети. Я не уверен, что такое поведение согласуется с общим контрактом для потоков. Если бы мне пришлось угадывать, вероятно, справедливо одно из следующих трех:
- В договоре
iostream
ничего не говорится о чередующемся чтении и записи, или
- Как правило, в контракте
iostream
ничего не говорится о чередующемся чтении и записи, но в спецификации есть определенные предвидения, регулирующие работу стандартных типов, таких как fstream
и stringstream
, или
- В контракте
iostream
действительно говорится что-то о чередующемся чтении и записи, что делает мой сетевой поток нарушающим класс.
У меня есть копия спецификации, но раздел о потоках настолько плотный и загадочный, что его почти невозможно проследить. Если бы кто-нибудь мог уточнить, как именно iostream
должен вести себя, когда вы смешиваете чтение и запись, я был бы очень признателен.