1

我有一个程序正在将结果写入文件,我想从该文件中实时读取。它是一个普通的文本文件,外部程序总是写一整行。我只需要在 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);
}

这是一个正确的方法吗?或者检查修改时间然后打开文件会更好吗?如果文件同时被修改,读取是否可能会崩溃?

4

3 回答 3

4

为了避免每次循环迭代都需要关闭、重新打开和重新查找,请clearerr在读取 EOF 后调用流。

于 2012-08-30T23:54:47.133 回答
1

如果您在其他程序写入的同时阅读,您应该没有任何问题。最糟糕的情况是直到下次打开文件时才能看到写入的内容。

此外,您将最后一次查找位置与文件末尾进行比较的方法是查找文件添加内容的好方法,因为外部程序只是编写额外的行。不过,我建议您在循环结束时添加一个 sleep(1),这样您就不会使用大量 CPU。

于 2012-08-30T23:09:33.803 回答
0

在另一个进程正在写入文件时读取文件没有问题。标准tail -f实用程序经常用于该目的。

唯一需要注意的是,写入过程不能以独占方式锁定文件。

关于您读取的代码(即使用fgetc()),由于您说写入过程将一次写入一行,因此您可能需要查看fgets()

于 2012-08-30T23:39:26.333 回答