14

我正在尝试打开一个二进制文件进行写入而不删除内容。但我不想写信给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();

如果使用应用程序,则搜索不起作用。如果不使用应用程序打开文件会擦除数据。有人知道答案吗?

4

5 回答 5

12

尝试第二个重载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);
  }
}
于 2011-06-21T15:21:05.993 回答
6

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

或者正如 crashmstr 指出的那样:ios::out可能就足够了。

于 2011-06-21T15:30:29.357 回答
5

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

于 2011-06-21T15:20:07.883 回答
3

根据 fstream 这里的规范

fstream::打开

ios::app “在每次输出操作之前将流的位置指示器设置为流的末尾。” 所以 ios::app 不能用于替换,任何类型的搜索都会失败,至少对我来说。

仅使用 ios::out 确实会清除仅保留大小的文件内容,基本上将文件变成垃圾。

ios::in|ios::out 对我来说是唯一有效的东西。

于 2011-07-20T18:56:21.400 回答
0

工作代码:此代码在 cout.exe 中搜索字符串 (OLD-STRING) 并替换为新字符串 (NEW-STRING)。

`#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
  fstream ifs;
  ifs.open ("C:\\Users\\user\\Desktop\\cout.exe", fstream::binary | fstream::in | fstream::out);

  std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());

  size_t pos = str.find("OLD-STRING");

  if (pos != string::npos)
  {
    cout << "string found at position: " << int(pos) << endl;

    ifs.seekp(pos);

    ifs.write("NEW-STRING", 10);

  }
  else
  {
    cout << "could not find string" << endl;
  }

  if (ifs.is_open())
    ifs.close();

  return 0;
}`
于 2012-09-13T12:22:48.913 回答