写入现有二进制文件c ++的中间

Jon*_*ert 13 c++ file append stream seek

我正在尝试打开二进制文件进行写入而不删除内容.但我不想写给eof.我想写一个文件中的特定位置.

这是一个小例子:

ofstream out("test.txt", ios::binary | ios::app);
for(int i = 0; i < 100; i++)
    out.put('_');
out.write("Hallo", 5);
out.close();

ofstream out2("test.txt", ios::binary | ios::app);
out2.seekp(10);
out2.write("Welt", 4);
out2.close();
Run Code Online (Sandbox Code Playgroud)

如果使用app,搜索不起作用.如果不使用app打开文件擦除数据.有人知道答案吗?

Nim*_*Nim 11

尝试第二次重载seekp,它允许你提供偏移量和方向,这可能是你的情况下的文件开头(即ios_base::beg).这当然假设您知道自己在做什么,而您想要做的就是覆盖现有的字符数.

编辑:这是完全有效的例子:

#include <iostream>
#include <fstream>

using namespace std;
int main()
{
  {
    ofstream out("test.txt", ios::binary);
    for(int i = 0; i < 100; i++)
      out.put('_');
    out.write("Hallo", 5);
  }

  {   
    fstream out2("test.txt", ios::binary | ios::out | ios::in);
    out2.seekp(10, ios::beg);
    out2.write("Welt", 4);
  }
}
Run Code Online (Sandbox Code Playgroud)


Ker*_* SB 5

你不能从中间神奇地扩展文件.也许最容易写入新文件:首先复制初始段,然后写入新数据,然后复制剩余段.完成所有操作后,您可以覆盖原始文件.


ste*_*anv 5

当使用ios :: app打开时,就好像您打开一个恰好附加到现有文件的新文件:您无法访问现有文件.我不确定,因为我会像Kerrek的回答一样,但是如果你真的想尝试,你可能需要打开" ios :: in | ios :: out ",类似于fopen("test.txt") ,"rw").

或者像crashmstr指出的那样:ios :: out可能已经足够了.

  • 你需要`ios :: out`和`ios :: in`,否则,它只是覆盖了methinks .. (5认同)