同时读写文件?

4

将问题移至此处。假设我想存储10亿个整数,但无法使用我的内存。我会使用一个文件(可以轻松处理这么多数据)。 如何同时进行读写操作? 使用 fstream file("file.txt', ios::out | ios::in ); 并不会首先创建文件。但是假设文件已经存在,我仍然无法同时进行读写操作。 我的意思是: 让文件的内容为 111111 然后如果我运行:-

#include <fstream>
#include <iostream>
using namespace std;
int main()
{
  fstream file("file.txt",ios:in|ios::out);
  char x;
  while( file>>x)
  {
    file<<'0';
  }
 return 0;
}

文件的内容现在不应该是101010吗?读取一个字符,然后用0覆盖下一个字符?或者如果整个内容一次性读入某个缓冲区,文件中不应至少有一个0吗?1111110? 但是,文件的内容保持不变。请解释一下。 谢谢。

有趣的问题。当我在 file << '0'; 之前和之后放置 file.tellg(); file.tellp(); 时,我确实得到了 101010(通过调试输出意外发现)。这表明程序中存在一些未定义的行为?fstream 实现中的错误? - UncleBens
2个回答

4
文件流维护两个指针,一个用于读取,一个用于写入。如果您要执行读/写操作,则需要使用seegseekp成员函数显式设置这些指针。您还会发现,执行格式化的I/O可能会干扰您正在尝试的操作,因此您应该使用get/putread/write成员函数代替。
有关fstream开放模式的更多信息,请参见为什么我不能在Mac OS X上使用std :: fstream进行读取和追加?

1
两种可能的解决方案,可以更加高效:(i) 使用64位操作系统或 (ii)使用mmap

% man mmap


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接