更好的方法删除文件中的行?

时间:2011-04-19 21:50:01

标签: c file-io

我想从文件中删除一行,目前我正在oldTodoFile中的每一行循环,如果lineNumber不等于todoNumber,则将其添加到新文件(todoFile)。这似乎不是删除行的好方法,是否有更好的删除行的方法?

FILE *oldTodoFile;
oldTodoFile = fopen("./todo.txt", "r");

FILE *todoFile;
todoFile = fopen("./todo2.txt", "w");
int lineNumber = 0;
int len;
char line[4096];

if (oldTodoFile != NULL) {
    while (fgets(line, sizeof line, oldTodoFile)) {
        len = strlen(line);
        if (len && (line[len - 1] != '\n')) {} else {
            lineNumber++;
            if (lineNumber == todoNumber) {
                // Do nothing   
            } else {
                fputs(line, todoFile);
            }
        }
    }
} else {
    printf("ERROR");
}
remove("./todo.txt");
rename("./todo2.txt", "./todo.txt");
fclose(oldTodoFile);
fclose(todoFile);

3 个答案:

答案 0 :(得分:3)

文件只是一系列字节。如果要删除一行,则必须在该行之后移动任何内容。我认为你正在做的事情很好,但你也可以从你要删除的行开始覆盖文件。

为此,您需要两个指向该文件的文件描述符。当你从第二个阅读时,你会写第一个。

完成后,您可以截断文件以删除最后的额外数据。

答案 1 :(得分:1)

不,这是做到这一点的方法。无法从文件中间删除数据。

您可能希望在发生错误时修复代码,但仍会尝试在最后执行删除/重命名。

答案 2 :(得分:0)

如果您的操作系统支持内存映射文件,您可以记录该文件,然后使用memmove()移动数据。它可能会或可能不会更高效,但生成的代码可能更容易实现,维护和调试。

这不一定是“更好”的方式,但需要考虑。