我正在从开始到结束的while循环中读取文件:
FILE *file;
file = fopen(path_to_file), "r");
char *line = NULL;
size_t len = 0;
while (getline(&line, &len, file) > 0) {
delete_line_from_file(line);
}
fclose(file);
函数delete_line_from_file()
删除从文件传递给它的行。它通过open(fd, O_RDONLY | O_CLOEXEC)
+ read()
+ close()
读取整个文件,然后从缓冲区中删除该行,并通过open(fd, O_WRONLY | O_TRUNC | O_CLOEXEC)
+ {{将整个缓冲区写入同一文件1}} + write()
。 close()
通过read()
锁定在通知读锁中,struct flock lk
被锁定在通知写锁中。
当我读取文件时,有些行会被遗漏,这与我在写入文件时从头到尾读取文件有关。如果我读完整个文件并逐行浏览缓冲区,则不会错过任何行。 (到目前为止,这是我首选的解决方案。)截断和写入文件时也没有错误。循环结束后,遗漏的行仍在文件中。
我可以确保我的while循环不会遗漏一行并干净地清空文件吗?该文件需要逐行清空。它不能被截断。
这是我想到的一种可能的解决方案。通过write()
镜像文件并使用fstat(file &fbuf)
检查其大小,但这似乎效率低下。
答案 0 :(得分:0)
完全清空文件的目标是什么?
为什么不打开文件:
open("file", O_TRUNC | O_WRONLY);
这将打开截断文件。或者,也许是更好的解决方案,您可以这样做:
fopen("file", "w");
与" w"选项删除原始文件并将其替换为名称为" file"。
的新文件答案 1 :(得分:0)
在你的循环中使用fseek和ftell。
修改同一文件的两个进程是问题的处方。可能你需要使用烟斗(2)。