在另一个函数更新时,逐行读取while循环中的文件

时间:2015-08-22 04:54:50

标签: c file-pointer readwritelock

我正在从开始到结束的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) + {{将整个缓冲区写入同一文件1}} + write()close()通过read()锁定在通知读锁中,struct flock lk被锁定在通知写锁中。

当我读取文件时,有些行会被遗漏,这与我在写入文件时从头到尾读取文件有关。如果我读完整个文件并逐行浏览缓冲区,则不会错过任何行。 (到目前为止,这是我首选的解决方案。)截断和写入文件时也没有错误。循环结束后,遗漏的行仍在文件中。

我可以确保我的while循环不会遗漏一行并干净地清空文件吗?该文件需要逐行清空。它不能被截断。

这是我想到的一种可能的解决方案。通过write()镜像文件并使用fstat(file &fbuf)检查其大小,但这似乎效率低下。

2 个答案:

答案 0 :(得分:0)

完全清空文件的目标是什么?

为什么不打开文件:

open("file", O_TRUNC | O_WRONLY);

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

fopen("file", "w");

与" w"选项删除原始文件并将其替换为名称为" file"。

的新文件

答案 1 :(得分:0)

在你的循环中使用fseek和ftell。

修改同一文件的两个进程是问题的处方。可能你需要使用烟斗(2)。