使用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
应该如何表现,我真的很感激。
答案 0 :(得分:10)
我不确定 C ++ 标准的章节和章节(我没有检查),但我非常熟悉 C 关于这个问题的标准(我做有)。
C99声明可以在读取,写入或“更新”模式下打开流。只有后一种模式允许读取和写入相同的流,但(引用):
...输出不应直接跟随输入而不是 干预调用
fflush
函数或文件定位函数(fseek
,fsetpos
或rewind
),输入不得直接跟随没有输出的输出 除非输入操作遇到,否则干预调用文件定位功能 档案结尾。
我认为C ++标准在某处说了类似的东西:你必须在读/写方向“反转”之前刷新或重新定位流。
编辑确实有两个单独的指针 - 可以使用basic_istream::tellg
和basic_ostream::tellp
进行查询。但是,我发现提到两个不指向流中相同位置的可能性仅与stringstream
相关,而不是fstream
。结合上面的陈述,这是有道理的。仍然不能指出你对标准的章节和诗句,但是抱歉。