我想从文件中删除特定的块。为此,我打开了两个文件,第一个文件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。我寻找块,当我认为是块时,我保存开头...
如果使用fseek()
后退文件位置指示符,则任何已写入文件的现有数据均保持不变。任何后续的fputc()
都将覆盖文件中已有的数据(包括先前写入的数据),并且在传递先前写入的数据的末尾后将继续扩大文件。