2

我正在从头到尾在 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);但这似乎效率低下。

4

2 回答 2

0

在循环中使用 fseek 和 ftell。

修改同一个文件的两个进程是问题的根源。可能您需要使用管道(2)。

于 2015-08-22T06:23:26.027 回答
0

那么目标是完全清空文件吗?

你为什么不这样打开文件:

open("file", O_TRUNC | O_WRONLY);

这将打开带有截断的文件。或者,也许是更好的解决方案,您可以这样做:

fopen("file", "w");

带有“w”选项的 fopen 删除原始文件并将其替换为名为“file”的新文件。

于 2015-08-22T06:02:57.917 回答