我在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);
的大小,但似乎效率低下。
那么目标是完全清空文件吗?
你为什么不这样打开文件呢:
open("file", O_TRUNC | O_WRONLY);
这将以截断方式打开文件。或者,也许是更好的解决方案,您可以这样做:
fopen("file", "w");
fopen使用"w"选项删除原文件,并将其替换为名为"file"的新文件
在循环中使用fseek和ftell。
两个进程修改同一个文件会导致问题。可能您需要使用管道(2)。