C语言 在while循环中逐行读取文件,同时另一个函数更新它



我在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)。

相关内容

  • 没有找到相关文章

最新更新