如何在处理不断增长的输入文件时安全地退出循环? [英] How to exit safely from a loop while working on a growing input file?

查看:0
本文介绍了如何在处理不断增长的输入文件时安全地退出循环?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在读取一个不断增长的输入文件,并执行一些工作并将信息写入输出文件。我有一些条件来处理这个不断增长的文件。但我在退出循环方面失败了。

FILE *logfile;

int main(int argc, char *argv[])
{
  char *filename;
  char *logfilename;
  FILE *infile;
  char line_buf[255];
  char *line;

  sleep(3);

  if (argc < 3) {
    fprintf(stderr, "Usage: %s <filename> <logfile>
",
            argv[0]);
    return -1;
  }
  filename = argv[1];
  logfilename = argv[2];


  infile = fopen(filename, "rb");
  if (infile == NULL) {
    fprintf(stderr, "Failed to open file
");
    return -1;
  }

  logfile = fopen(logfilename, "w");
  if (logfile == NULL) {
    fprintf(stderr, "Failed to open logfile - are permissions correct?
");
    return -1;
  }

  while(1){
    line = fgets(line_buf, sizeof(line_buf), infile);


    if (line == NULL){
      if(feof(infile))
           clearerr(infile);
      failedReads++;
      usleep(25000); //wait for the data from live file
      continue;     
    }

    else{  
            if(feof(infile))
                   break;
    }

    ...........
    //do some work
    ...........
  }

 fclose(infile);
 fclose(logfile);
}

我的输出日志文件仅在输入文件停止增长(意味着在执行结束时)才获得数据。我希望我的输出日志文件按时间获得数据(意味着输出文件没有增长)。我有一个用于创建一个不断增长的文件(如果有人真的想处理我的问题)的python脚本。

#/usr/bin/python
import time
with open("input.txt") as f:
    fileoutput = f.readlines()
with open("out.txt", "a+") as f1:
    for line in fileoutput:
        f1.write(line)
        f1.flush()
        time.sleep(0.01)

推荐答案

代码正在无限期等待其他数据。对于usleep(25000*failedReads),代码等待的时间越来越长。

// Ineffective code
if (line == NULL){
  if(feof(infile))
       clearerr(infile);
  failedReads++;
  usleep(25000*failedReads); //wait for the data from live file
  continue;     
}

else{
        if(line == NULL)  // this can never be true!
                if(feof(infile))
                        break;
}

"按时间获取数据(意味着输出文件没有增长")意味着应该有一个时间上限,如果输入文件无法提供更多数据,则退出循环。

查找连续两次读取失败。如果在第一次失败后等待未提供更多数据,则需要时间离开。

// instead
bool failed_read_flag = false;
while(1){
  line = fgets(line_buf, sizeof(line_buf), infile);
  if (line == NULL){
    if (failed_read_flag) {
      break; // 2 successive read fails 
    }
    if(!feof(infile)) {
      break; // Rare input error just occurred.
    }
    clearerr(infile);
    failed_read_flag = true;
    usleep(25000 /* us */); //wait for the data from live file
    continue;     
  }
  failed_read_flag = false;

  // Do some work
}

奇怪,使用infile = fopen(filename, "rb");打开文件,然后将其与fgets()一起使用。

如果文件是文本文件,请使用fopen(filename, "r")。如果文件是二进制文件,请使用fread()

这篇关于如何在处理不断增长的输入文件时安全地退出循环?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆