我正在从头到尾在 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)
write()
close()
read()
struct flock lk
write()
当我读取文件时,有些行会丢失,这与我在写入文件时从头到尾在一个循环中读取文件有关。如果我读入整个文件并逐行浏览缓冲区,则不会遗漏任何行。(到目前为止,这是我首选的解决方案。)在截断和写入文件时也没有出错。循环结束后,丢失的行仍在文件中。
我可以确保我的 while 循环不会遗漏一行并完全清空文件吗?该文件需要逐行清空。它不能被截断。
这是我想到的一种可能的解决方案。通过镜像文件fstat(file &fbuf)
并检查它的大小,if (fbuf.st_size !=0) fseek(file, 0, SEEK_SET);
但这似乎效率低下。