c++ - 在c++中使用相同的fstream对象进行读写时是否存在任何错误诱导特征

标签 c++ file stream fstream

我正在尝试学习 C++ fstream、ifstream、ofstream。在我的项目进行到一半时,我了解到如果我们使用 ofstream 和 ifstream 访问同一个文件进行读写,最好在使用另一个流之前关闭流。

喜欢 ofstream write_stream(...); ifstream read_stream(....);

 // Accessing pointers using both read_stream, write_stream interchangebly 

  read_stream.read(....);
  write_stream.write(....);

  read_stream.close(); 
  write_stream.close();

///

在上面的例子中,我猜这两个流在文件中使用了相同的指针,所以我需要知道指针的移动,所以我每次尝试读取()或写入( ).

到目前为止,我想我是对的。

为了避免更多的困惑,我决定使用这种格式

 fstream read_write_stream("File.bin",ios::in|ios::out|ios::binary);
 read_write_stream.seekp(pos);
 read_write_stream.seekg(pos);
 read_write_stream.tellp();
 read_write_stream.tellg()

 read_write_stream.read(...);
 read_write_stream.write(...);

 read_write_stream.close()

在上面的程序中是否有任何我应该注意的错误诱导功能???请指教

最佳答案

虽然我不知道标准是否明确提到这种情况,但我不认为 C++ 编译器可以向您保证在您使用多个流更改相同的外部资源(文件在这个案例)。除了 fstream 内部实现之外,它还取决于操作系统和您写入的硬件。如果我是正确的,默认情况下,它会使此操作成为未定义的行为。

如果你使用两个不同的流,很可能每个流都会管理自己的 put 和 get 指针,每个流都有缓冲,这意味着如果你不使用 flush(),你将无法确定什么是命令操作将在文件上完成。

如果您使用一个流来同时读取和写入,我认为该行为将是可预测的并且更容易理解。

关于c++ - 在c++中使用相同的fstream对象进行读写时是否存在任何错误诱导特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051615/

相关文章:

c# - 从 dotnetzip 创建的 zip 文件中提取时出错 - "Windows cannot complete the extraction."

java - 如何减少InputStreams和OutputStreams之间的写入?

c++ - 如何在 *.inl 文件的模板类中定义模板函数

C++:仅在一个元素上使用 unique_copy

java - ZeroMQ 跨语言消息翻译 CPPZMQ -- JeroMQ -- PyZMQ

c++ - 循环中的循环算法

java - 有效的文件复制

C++ 将字符串写入文件 = 额外字节

Java - 获取给定源和 mime 类型的图像文件扩展名

java 连接到 jabber