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