更好的方式来删除文件中的一行?
问题描述:
我想从文件中删除一行,当前我正在循环遍历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);
答
文件只是一系列字节。如果你想删除一行,你必须在该行后面移动任何内容。我认为你所做的只是很好,但你也可以从你正在删除的行开始覆盖文件。
要做到这一点,您需要两个文件描述符指向文件。当你从第二个阅读时,你会写第一个。
当你完成后,你可以截断文件以摆脱最后的额外数据。
答
不,就是这样做。没有办法从文件中间删除数据。
您可能希望在发生错误时修复代码,但仍会尝试在最后执行删除/重命名。
答
如果您的操作系统支持内存映射文件,您可以将文件映射到映射文件,然后使用memmove()移动数据。它可能会也可能不会更有效率,但生成的代码可能更容易实现,维护和调试。
它不一定是一种“更好”的方式,但它是需要考虑的事情。
非常相似:http://stackoverflow.com/questions/1151713/delete-a-line-from-a-file-in-c-language – 2011-04-19 21:52:36
没有出现在搜索:http:// stackoverflow。 COM /搜索?q =更好的方式+ +至+删除+ A +线+在+ A +文件%3F – errorhandler 2011-04-19 21:54:25