交错读写有什么保证?

时间:2011-02-14 11:52:36

标签: c++ iostream

使用C ++ std::iostream时(例如,std::fstreamstd::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;

从网络读取。我不确定这种行为是否与流的一般合同一致。如果我不得不猜测,以下三个中的一个可能会成立:

  1. iostream合同没有说明交错式读写,或
  2. 一般情况下,iostream合同没有说明交错式读写,但规范中有一些特定的预设,用于管理fstreamstringstream等标准类型的工作方式,或
  3. iostream合同确实说明了交错式读写操作,这会导致我的网络流类违反。
  4. 我有一份规范的副本,但关于流的部分是如此密集和神秘,几乎不可能遵循。如果有人能够清楚地说明当您混合读写时iostream应该如何表现,我真的很感激。

1 个答案:

答案 0 :(得分:10)

我不确定 C ++ 标准的章节和章节(我没有检查),但我非常熟悉 C 关于这个问题的标准(我有)。

C99声明可以在读取,写入或“更新”模式下打开流。只有后一种模式允许读取和写入相同的流,但(引用):

  

...输出不应直接跟随输入而不是   干预调用fflush函数或文件定位函数(fseek,   fsetposrewind),输入不得直接跟随没有输出的输出   除非输入操作遇到,否则干预调用文件定位功能   档案结尾。

我认为C ++标准在某处说了类似的东西:你必须在读/写方向“反转”之前刷新或重新定位流。

编辑确实有两个单独的指针 - 可以使用basic_istream::tellgbasic_ostream::tellp进行查询。但是,我发现提到两个指向流中相同位置的可能性仅与stringstream相关,而不是fstream。结合上面的陈述,这是有道理的。仍然不能指出你对标准的章节和诗句,但是抱歉。