
朱老师为您分享以下优质知识
在C语言中删除二进制文件内容可以通过以下两种常见方法实现:
一、覆盖写入法
通过读取后续数据覆盖目标位置内容,达到删除效果。适用于删除固定长度的数据块。
步骤:
1. 以读写模式打开文件(`"rb+"`)
2. 定位到要删除内容的位置
3. 读取后续数据到缓冲区
4. 将缓冲区内容覆盖到目标位置
5. 关闭文件
示例代码:
```c
include
include
int main() {
FILE *fp = fopen("binary_file.bin", "rb+");
if (fp == NULL) {
perror("Failed to open file");
return 1;
}
// 假设要删除从偏移量10开始的10个字节
fseek(fp, 10, SEEK_SET);
char buffer;
size_t bytes_read = fread(buffer, sizeof(char), 10, fp);
if (bytes_read != 10) {
perror("Failed to read data");
fclose(fp);
return 1;
}
// 将后续数据覆盖到删除位置
fseek(fp, -bytes_read, SEEK_CUR);
fwrite(buffer, sizeof(char), bytes_read, fp);
fclose(fp);
return 0;
}
```
二、临时文件法
通过创建临时文件,将不需要删除的内容复制过去,最后替换原文件。适用于删除不规则位置或长度的数据。
步骤:
1. 以读写模式打开原文件(`"r+"`)
2. 以读写模式创建临时文件(如`"linshi.txt"`)
3. 逐块读取原文件内容,跳过需要删除的部分,写入临时文件
4. 删除原文件
5. 重命名临时文件为原文件名
示例代码:
```c
include
include
include
define BUFFER_SIZE 1024
int main() {
FILE *fp = fopen("users.txt", "r+");
FILE *temp_fp = fopen("linshi.txt", "w+");
if (fp == NULL || temp_fp == NULL) {
perror("Failed to open file");
return 1;
}
char buffer[BUFFER_SIZE];
while (fread(buffer, sizeof(char), BUFFER_SIZE, fp)) {
// 假设要删除denglu.num字段为"123"的记录
if (strcmp(buffer, "denglu.num=123
") != 0) {
fwrite(buffer, sizeof(char), strlen(buffer), temp_fp);
}
}
fclose(fp);
fclose(temp_fp);
if (remove("users.txt") != 0) {
perror("Failed to remove file");
return 1;
}
if (rename("linshi.txt", "users.txt") != 0) {
perror("Failed to rename file");
return 1;
}
return 0;
}
```
注意事项
只能删除固定长度的数据块,无法直接删除不连续或可变长度的数据
适用于大文件,但需要额外的磁盘空间
操作前建议备份文件,避免数据丢失
根据具体需求选择合适的方法,若需删除不规则数据,建议使用临时文件法;若需删除固定数据块,覆盖写入法更高效。