【问题标题】:How to insert text into a file using fseek and fwrite [duplicate]如何使用 fseek 和 fwrite 将文本插入文件 [重复]
【发布时间】:2013-12-14 09:49:58
【问题描述】:

如何使fseekfwrite 一起使用时不会覆盖给定位置的内容?

我正在用

打开一个文件
file = fopen(filename, "r+");

然后使用

fseek (file, pos, SEEK_SET);

去我需要的位置,使用

fwrite(text, 1, text_size, file);

写入数据。

示例:

说,我想在位置 3 处添加“7”:

abcdef

我想要这个

abc7def

【问题讨论】:

  • fseek 没有写任何东西 - 你能澄清你的问题吗?
  • 我认为您应该重申您的问题,例如“如何使用 fseek 和 fwrite 将文本插入文件”。
  • 你的意思是没有办法做到这一点?
  • 当我更改单个字符时,人类制作的所有文本编辑器都是通过复制文件来工作的吗?
  • 不,先生,为什么我的问题是-1,这是一个很好的问题?

标签: c++ fseek


【解决方案1】:

您不能插入到文件中。实现这一点的唯一方法是将文件的其余部分保存在某处,编写新内容,然后从保存的位置附加文件的其余部分。但是您必须在要插入的内容之后重新编写文件的整个部分。

【讨论】:

  • 当我更改单个字符时,人类制作的所有文本编辑器都是通过复制文件来工作的吗?
  • 不,他们将文件加载到内存中,在内存中处理您的编辑,然后在您选择保存时写回(整个文件!)。
  • 有任何方法,任何语言,甚至汇编?我的文件将是数百兆字节...
  • @SkyRipper:你认为会发生什么?不知何故,必须腾出更多空间来容纳新角色。如果您希望整个文本流保持连续,那么该空间将来自哪里?
  • @SkyRipper:限制不是编程语言限制。操作系统和文件系统不提供在文件中间插入字节的 API。一些程序,如几年前的 MS Word,通过制作自定义的类似数据库的文件格式来解决这个问题,这些文件格式将大量文本非线性地串在一起。但是,您只能在 MS Word 中读取该文件。文本编辑器进行离线编辑(在内存中,或使用内存和临时文件的组合),然后在保存时替换原始文件。
【解决方案2】:

Fseek 不会覆盖任何内容。如果您在 fseek 之后使用 fwrite、fputs、fputc 或类似函数,则可以覆盖您要查找的位置的内容。

【讨论】:

  • 非常正确,如何避免?
  • 你想避免什么? fseek 后覆盖?然后不要使用写入文件的函数。如果您的问题是:如何使任何写入函数写入文件末尾,而不是您 fseek() 的位置 - 使用 fseek(fp, 0, SEEK_END)。​​
  • 请看上面的例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多