【问题标题】:How do I insert and delete some characters in the middle of a file?如何在文件中间插入和删除一些字符?
【发布时间】:2010-03-12 07:14:28
【问题描述】:

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

fopen() 和 fdopen() 只允许在末尾追加。

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

【问题讨论】:

  • 推荐使用插入数据创建新文件。完成后,重命名并删除原件。

标签: c file-io


【解决方案1】:

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

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

如果要删除中间的字符,那就比较麻烦了。实际上,您不能使文件更短。你有两种可能:在第一种中,你只是

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

在第二种可能性中,你:

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

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

【讨论】:

  • 非常感谢,我想您对此了解更多。我们可以在其他地方谈谈这个吗?
  • 我对搜索文件中文本位置的话题很感兴趣。也许有一个好方法或者我必须逐个字符地测试?
  • 在文本文件中搜索是,是的,基本上是逐个字符测试的问题。但这是另一个完全不同的话题:例如,您可以借助正则表达式。
【解决方案2】:

没有简单的方法。你必须手动完成。例如:

  1. 将之前要插入的块读入内存
  2. 寻求新职位
  3. 将刚刚读到的块写入新位置
  4. 返回到要插入的位置
  5. 写入新数据。

【讨论】:

  • 谢谢!所以我必须使用 "fopen("1.txt","w");"然后 fseek ? :) 据我了解,我的问题的答案是肯定的。
  • @Infinity: 使用fopen("1.txt", "r+"),它打开用于读取写入。模式"w" 覆盖之前可能存在的任何文件,留下一个空文件。
  • 我不明白第 2 步和第 3 步。天哪,你的意思是用块临时文件?还是缓冲区?我的想法是将要插入的字节大小附加到文件源的字节大小。然后写到
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    long Fin;
    long lSize;
    fseek(fd, 0L, SEEK_END);
    Fin = ftell(fd);//get the old file size
    fseek(fd, position, SEEK_SET);//"position" must be declared and initialized 
    char * buffer;
    lSize = Fin - position;//length from where you want to insert the chars to 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);//word is a char pointer that contains the text to be inserted
    fputs(buffer, fd);//fwrite the buffer
    

    我实际上使用这段代码(经过一些修改)将给定文件中包含每个元音的单词一式三份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多