如何在文件中间插入和删除一些字符?

我想在文件中间插入和删除一些字符。

fopen()和fdopen()只允许追加到最后。

是否有允许这些操作的简单方法或现有库?

没有简单的方法。 你已经手动完成了。 例如:

  1. 在内存之前读取要插入的块
  2. 寻求新的职位
  3. 写下您刚刚在新位置阅读的块
  4. 回到你想要插入的地方
  5. 写下新数据。

正如其他人已经告诉过你的那样,你必须手动完成,并使用fseek来到你必须插入或添加字符的地方。 您可以通过执行以下操作轻松地在中间添加新字符:

  1. 转到文件的最后一个字节,并存储文件的旧文件大小。
  2. 转到要插入新字符的位置(比如这是位置):fread(旧文件大小 – 位置)字节,并将它们存储在缓冲区中。
  3. fseek再次定位。
  4. 写下你的新角色。
  5. fwrite你以前读过的缓冲区。

如果你想删除中间的字符,那么这更棘手。 实际上你不能缩短文件。 你有两种可能性:第一种,你就是

  1. 打开文件并读取文件,跳过要删除的字符并将其存储在缓冲区中
  2. 用“b”关闭并重新打开文件,其内容将被删除,
  3. 写入缓冲区并关闭文件。

在第二种可能性中,您:

  1. 将缓冲区读取到要删除的字符前面的字符。
  2. fseek到要删除的字符的开头
  3. fwrite缓冲区。
  4. 修剪文件的其余部分。

第四点是“棘手的”,因为没有标准(便携)方式来做到这一点。 一种可能性是使用操作系统系统调用来截断文件。 另一个更简单的可能性就是在第4点写入EOF。文件可能会比它应该更大,但它可以解决问题。

使用fseek函数将文件指针移动到文件的适当位置,然后您可以在那里执行写操作。 但是,为此您应该知道文件的结尾或开头有多少字节是您首选的写入区域。

考虑到Baltasarq发布的内容,我写了以下几行。 您需要知道要插入字符的位置

 long Fin; long lSize; fseek(fd, 0L, SEEK_END); Fin = ftell(fd);//I get the old file size fseek(fd, position, SEEK_SET);//you should have declared and initialized "position" char * buffer; lSize = Fin - position;//lenght from where you want to insert the chars and the eof buffer = (char*) malloc(sizeof(char) * lSize); size_t result = fread(buffer, 1, lSize, fd);//fread (Fin - position) into buffer fseek(fd, position, SEEK_SET);//fseek to position fputs(word, fd);//you should know what you want to write (word) and it is a char pointer fputs(buffer, fd);//fwrite the buffer 

我实际上使用这段代码(在一些修改之后)将给定文件中包含每个元音的单词重复三次。