当使用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;
从网络读取。我不确定这种行为是否与流的一般契约(Contract)一致。如果我不得不猜测,可能是以下三种之一:
iostream
合约对交错的读写没有任何要求,或者说iostream
契约(Contract)对交错的读写没有任何规定,但是规范中有一些特定的规定来控制fstream
和stringstream
等标准类型或iostream
契约(Contract)确实说了一些有关交错读取和写入的内容,这使我的网络流类违反了。 我有一个规范的拷贝,但是关于流的部分是如此密集和神秘,几乎无法遵循。如果有人能确切说明在混合读写时,
iostream
的行为,我将不胜感激。 最佳答案
我不确定 C++ 标准(我没有来检查一下)的章节和含义,但是我对这个主题的 C 标准(我确实有了解)非常熟悉。
C99指出可以以读取,写入或“更新”模式打开流。只有后一种模式允许读取和写入同一流,但是(引用):
我会假设C++标准在某处说了类似的话:您必须先刷新流或重新定位流,然后才能在读/写方向上“反转”。
编辑:实际上,有两个单独的指针-可以使用basic_istream::tellg
和basic_ostream::tellp
进行查询。但是,我发现提到了两种可能性,即仅与stringstream
有关,而不是与fstream
有关,它们没有指向流中的同一位置的可能性。结合上面的陈述,这样做是有意义的。但是,仍然抱歉,您无法指向标准的章节。