【问题标题】:Reading already opened file continuously using C使用C连续读取已经打开的文件
【发布时间】:2013-11-01 13:23:31
【问题描述】:

我正在实现一个轻量级应用程序,我必须经常打开并阅读 /proc/pid 或 tid/task/stat 详细信息。如果应用程序是多线程的,我必须阅读更多的统计文件。所以打开、阅读和关闭让我的监控应用程序真的很慢。是否有解决方案可以避免重复打开文件并且仍然能够读取更新的内容?

我进行了以下实验,但没有看到成功。我更改了“test.txt”中的数据,但没有读取新数据。是因为文件没有在内存中更新吗?当我修改并保存“test.txt”时会发生什么?

#include <stdio.h>
int main()
{
    FILE * pFile;
    char mystring [100];
    pFile = fopen ("test.txt" , "r");
    while(1){
        if (pFile == NULL) perror ("Error opening file");
        if ( fgets (mystring , 100 , pFile) != NULL ){
            puts (mystring);
            fseek ( pFile , 0 , SEEK_SET );
        }
        sleep(1);
    }
    fclose (pFile);
    return 0;
}

【问题讨论】:

    标签: c file-io polling


    【解决方案1】:

    试试这样的:

    for (;;) {
        while ((ch = getc(fp)) != EOF)  {
            if (putchar(ch) == EOF)
                perror("Output error");
        }
        if (ferror(fp)) {
            printf("Input error: %s", errno);
            return;
        }
        (void)fflush(stdout);
        sleep(1); // Or use select
    }
    

    您可以通过研究source code for tail 找到完整示例。上面的代码是 forward.c 的修改摘录。

    您可以使用select 监控多个文件中的新数据(您需要保持它们打开)。

    【讨论】:

    • @Surya 如果您得到解决问题的答案,您应该接受该答案。接受答案会让其他人更容易回答你的问题。如果您觉得答案有帮助,您也可以点赞(只能接受一个答案,但可以点赞任何数量,每天最多 40 个)。
    • 该解决方案适用于读取刷新的文件,但由于它的 2 个无限循环,它可以也不能用于所有有时间限制的应用程序。
    【解决方案2】:

    试试rewind(),不要关闭你的文件。

    完成读取操作后,在此处关闭文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2019-03-26
      • 2015-04-06
      • 2018-06-13
      • 2017-09-08
      • 1970-01-01
      相关资源
      最近更新 更多