如何在处理不断增长的输入文件时安全地退出循环?

How to exit safely from a loop while working on a growing input file?

我正在读取一个不断增长的输入文件,并做一些工作并将信息写入输出文件。我有一些条件可以处理不断增长的文件。但是我无法退出循环。

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>\n",
            argv[0]);
    return -1;
  }
  filename = argv[1];
  logfilename = argv[2];


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

  logfile = fopen(logfilename, "w");
  if (logfile == NULL) {
    fprintf(stderr, "Failed to open logfile - are permissions correct?\n");
    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;
}

"to get the data by time(means output file is not growing" 意味着应该有一个时间上限,如果输入文件无法提供更多数据,则退出循环。

查找连续 2 次读取失败。如果在第一次失败后等待没有提供更多数据,该离开了。

// 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() 使用它很奇怪。

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