使用C语言写一个函数,删除文件中的某一行数据
时间: 2024-12-21 15:28:47 浏览: 19
在C语言中,直接修改文件内容并删除一行是比较复杂的操作,因为C标准库并没有提供直接操作文件行的功能。通常我们会选择先读取整个文件到内存中,然后处理需要删除的那一行,最后再将修改后的数据写回文件。这里是一个简单的示例,假设我们有一个文本文件,每行由'\n'分隔:
```c
#include <stdio.h>
#include <stdlib.h>
// 函数原型声明
void delete_line(char *filename, int line_num);
// 内部函数,用于删除指定行数的数据
static void delete_line_in_memory(char **lines, size_t num_lines, int target_line) {
if (target_line > 0 && target_line <= num_lines) {
memmove(lines + target_line - 1, lines + target_line, sizeof(char*) * (num_lines - target_line));
num_lines--;
}
}
// 主函数删除文件中的某一行
void delete_line(char *filename, int line_num) {
FILE *file = fopen(filename, "r+"); // 打开文件为读写模式
if (!file) {
perror("Error opening file");
return;
}
fseek(file, 0, SEEK_END); // 跳至文件末尾
size_t file_size = ftell(file);
fseek(file, 0, SEEK_SET); // 跳回文件开头
char **lines = malloc((file_size / sizeof(char *)) + 1); // 分配空间存储每一行
char *buffer = malloc(file_size);
size_t read_count = fread(buffer, 1, file_size, file);
// 拼接成字符串数组
lines[0] = buffer;
char *ptr = buffer;
for (size_t i = 1; i < read_count / sizeof(char); ++i) {
while (*ptr != '\n') { // 找到行结束符
ptr++;
}
*ptr++ = '\0'; // 结束当前行
lines[i] = ptr;
}
fclose(file); // 关闭原始文件
delete_line_in_memory(lines, read_count / sizeof(char), line_num - 1); // 删除指定行
FILE *new_file = fopen(filename, "w"); // 以写入模式打开新文件
if (!new_file) {
perror("Error creating new file");
free(lines);
return;
}
// 将剩余的行写回到文件
for (size_t i = 0; i < num_lines; i++) {
fwrite(lines[i], 1, strlen(lines[i]) + 1, new_file);
}
fclose(new_file); // 关闭新文件
free(buffer);
free(lines);
}
阅读全文