我有一个程序将结果写入文件,我想从该文件中实时读取。它是一个普通的文本文件,外部程序总是写一整行。我需要在Linux系统上运行它。
int last_read = 0;
int res;
FILE *file;
char *buf;
char *end = buf + MAXLINE - 1;
int c;
int fileSize;
char *dst;
while (external_programme_is_running()) {
file = fopen(logfile, "r"); //without opening and closing it's not working
fseek(file, 0, SEEK_END);
fileSize = ftell(file);
if (fileSize > last_read) {
fseek(file, last_read, SEEK_SET);
while (!feof(file)) {
dst = buf;
while ((c = fgetc(file)) != EOF && c != '\n' && dst < end)
*dst++ = c;
*dst = '\0';
res = ((c == EOF && dst == buf) ? EOF : dst - buf);
if (res != -1) {
last_read = ftell(file);
parse_result(buf)
}
}
}
fclose(file);
}
这是正确的做法吗?或者检查修改时间然后打开文件会更好吗?如果文件会在同一时间被修改,那么读取是否会崩溃?
答案 0 :(得分:4)
为了避免关闭,重新打开和重新寻找每个循环迭代的需要,请在阅读EOF后在流上调用clearerr
。
答案 1 :(得分:1)
如果您在其他程序写入的同时阅读,则不应该有任何问题。最糟糕的情况是,在下次打开文件之前,您不会看到写入的内容。
此外,将上一个搜索位置与文件末尾进行比较的方法是寻找文件添加的好方法,因为外部程序只是编写额外的行。我建议在循环结束时添加一个sleep(1),所以你不要使用大量的CPU。
答案 2 :(得分:0)
当另一个进程写入文件时,读取文件没有问题。标准tail -f
实用程序通常用于此目的。
唯一需要注意的是,写入过程不能专门锁定文件。
关于你的阅读代码(即使用fgetc()
),既然你说写作过程将一次写一行,你可能想要看一下fgets()
。