当使用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;

从网络读取。我不确定这种行为是否与流的一般契约(Contract)一致。如果我不得不猜测,可能是以下三种之一:
  • iostream合约对交错的读写没有任何要求,或者说
  • 通常,iostream契约(Contract)对交错的读写没有任何规定,但是规范中有一些特定的规定来控制fstreamstringstream等标准类型或
  • 的工作方式
  • iostream契约(Contract)确实说了一些有关交错读取和写入的内容,这使我的网络流类违反了。

  • 我有一个规范的拷贝,但是关于流的部分是如此密集和神秘,几乎无法遵循。如果有人能确切说明在混合读写时,iostream的行为,我将不胜感激。

    最佳答案

    我不确定 C++ 标准(我没有来检查一下)的章节和含义,但是我对这个主题的 C 标准(我确实有了解)非常熟悉。

    C99指出可以以读取,写入或“更新”模式打开流。只有后一种模式允许读取和写入同一流,但是(引用):



    我会假设C++标准在某处说了类似的话:您必须先刷新流或重新定位流,然后才能在读/写方向上“反转”。

    编辑:实际上,有两个单独的指针-可以使用basic_istream::tellgbasic_ostream::tellp进行查询。但是,我发现提到了两种可能性,即仅与stringstream有关,而不是与fstream有关,它们没有指向流中的同一位置的可能性。结合上面的陈述,这样做是有意义的。但是,仍然抱歉,您无法指向标准的章节。

    10-04 16:37