交错读写有什么保证?

tem*_*def 11 c++ iostream

使用C++时std::iostream(例如,std::fstream或者std::stringstream,标准是否保证在同一个流上执行读写之间的关系?也就是说,如果我将数据写入a 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?
Run Code Online (Sandbox Code Playgroud)

或者这个案子怎么样?

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?
Run Code Online (Sandbox Code Playgroud)

我问,因为我最近开发了一个网络流类,其中读取和写入不会相互影响(因为读取从网络拉出并写入通过网络发送).就是写作

myNetworkStream << "Hi there!" << endl;
Run Code Online (Sandbox Code Playgroud)

通过网络写,而

myNetworkStream >> myValue;
Run Code Online (Sandbox Code Playgroud)

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

  1. iostream合同只字未提交错读取和写入,或
  2. 一般来说,iostream合同只字未提交错读取和写入,但也有在特定的规范管理previsions如何使用标准的类型,如fstreamstringstream工作,或
  3. iostream合同不说说交错读取和写入操作,使我的网络流类违犯了.

我有一个规范的副本,但关于流的部分是如此密集和神秘,它几乎不可能遵循.如果有人能够清楚地说明iostream当你混合读写时s应该如何表现,我真的很感激.

Dev*_*lar 10

我不确定C++标准的章节和章节(我没有检查),但我对这个主题的C标准非常熟悉(我确实有).

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

...输出不应直接跟随输入而没有插入调用fflush功能或文件定位功能(fseek, fsetpos,或rewind),并且输入不应直接跟随输出而没有中间呼叫到一个文件中的定位功能,除非输入操作遇到文件结束.

我假设C++标准在某处说了类似的东西:你必须在读/写方向"反转"之前刷新或重新定位流.

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

  • 是的,C++标准通过引用C标准对基于文件的流说了同样的话:"读取和编写由类basic_filebuf <charT,traits>的对象控制的序列的限制与读写相同使用标准C库文件." 请注意,相同的限制不适用于stringstream. (5认同)