繁体   English   中英

就地文件编辑

[英]In-Place file editing

我目前正在尝试实现一个小的 function,它从一个文件中读取,对内容做一些事情并且应该就地替换它。 从文件中读取和写入文件的文本在大小上始终相同。 由于系统限制,我必须就地完成所有工作。 所以我写了一个小测试示例。 它写入“abcdefghijklmnop”16 次,关闭文件,再次打开,按 16 字节读取,并将其转换为大写(这里:简单的 char - 32)。 这只是我的问题的一个最小示例,我不会使用buf[b] = buf[b] - 32; 在现实生活中,某些字符会变大,所以请不要对此行发表评论;)

起初我尝试使用两个不同的ifstreamofstream ,但这没有用:它只是在文件末尾编辑了一些东西并擦除一些数据。

int main(int argc, char** argv) {
  char buf[8];
  std::ofstream testdata("testdata");
  for(int i = 0; i < 16; ++i) {
    testdata.write("abcdefghijklmnop", 16);
  }
  testdata.close();
  std::ifstream in("testdata");
  std::ofstream out("testdata", std::ofstream::app);
  out.seekp(0, std::ofstream::beg);
  for(int i = 0; i < 16; ++i) {
    in.read(buf, 16);
    for(int b = 0; b < 16; ++b) {
      buf[b] = buf[b] - 32;
    }
    out.write(buf, 16);
  }
  in.close();
  out.close();
  return 0;
}

接下来,我尝试使用单个fstream进行一些手动搜索。

int main(int argc, char** argv) {
  char buf[8];
  std::ofstream testdata("testdata");
  for(int i = 0; i < 16; ++i) {
    testdata.write("abcdefghijklmnop", 16);
  }
  testdata.close();
  std::fstream stream("testdata", std::fstream::in | std::fstream::out);
  stream.seekp(0,std::fstream::beg);
  stream.seekg(0,std::fstream::beg);
  auto inpos = stream.tellg();
  auto outpos = stream.tellp();
  for(int i = 0; i < 16; ++i) {
    stream.seekg(inpos);
    stream.read(buf, 16);
    inpos = stream.tellg(); // also tried inpos += 16;
    for(int b = 0; b < 16; ++b) {
      buf[b] = buf[b] - 32;
    }
    stream.seekp(outpos);
    stream.write(buf, 16);
    outpos = stream.tellp(); // also tried outpos += 16;
  }
  stream.close();
  return 0;
}

这会编辑前 8 个字节,扰乱接下来的 4 个字节,并保持 rest 不变。

我错过了什么? 还是我完全偏离了轨道?

正如@kMaster 在评论中指出的那样,第二个版本工作得很好。 唯一的问题是缓冲区大小不合适(8 个字节而不是 16 个字节)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM