fclose()一个文件指针不在最后位置的文件

问题描述 投票:0回答:1

我想从文件中删除特定的块。为此,我打开了两个文件,第一个文件fgetc,第二个文件fputc

我正在寻找块,当我认为是块时,我将起始位置保存为ftell。如果是这样,我将fseek移至第二个文件中的保存位置并继续写入,它将覆盖该块。

我担心的是,它仅能起作用是因为文件的其余部分大于所述块。如果块更大了怎么办?文件会关闭在当前位置吗,还是有剩余?无论哪种方式,这种技术似乎都不安全,我应该采取其他方法吗?

int remove(char *filename, char *chunk)
{
  char tmp[256];
  sprintf(tmp, "%s.tmp", filename);
  FILE *input  = fopen(filename, "r");
  FILE *output = fopen(tmp, "w+");
  int offset   = 0;
  int match    = 0;
  int length   = strlen(chunk);
  char c;
  while ((c = fgetc(input)) != EOF) {
    fputc(c, output);
    if (c == chunk[match++]) {
      if (!offset) offset = ftell(output) - 1;
    } else {
      match  = 0;
      offset = 0;
    }
    if (match == length) {
      offset -= ftell(output);
      fseek(output, offset, SEEK_CUR);
    }
  }
  fclose(input);
  fclose(output);
}

*在此示例中,我意识到不需要ftell,但是我在完整的函数中使用了它,因此我将其包括在内

我想从文件中删除特定的块。为此,我打开了两个文件,第一个文件是fgetc,第二个文件是fputc。我寻找块,当我认为是块时,我保存开头...

c file fseek
1个回答
0
投票

如果使用fseek()后退文件位置指示符,则任何已写入文件的现有数据均保持不变。任何后续的fputc()都将覆盖文件中已有的数据(包括先前写入的数据),并且在传递先前写入的数据的末尾后将继续扩大文件。

© www.soinside.com 2019 - 2024. All rights reserved.