当前位置: 首页 > 知识库问答 >
问题:

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

万坚壁
2023-03-14

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

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)

共有1个答案

徐鑫鹏
2023-03-14

代码正在无限期地等待其他数据。使用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(表示输出文件没有增长)"意味着应该有一个时间上限,如果输入文件不能提供更多的数据,则退出循环。

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

// 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");打开一个文件,然后将其与fget()一起使用,这很奇怪。

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

 类似资料:
  • 问题内容: 假设您有一个用于处理某种XML文件或配置文件的库。该库将整个文件读入内存,并提供用于编辑内容的方法。处理完内容后,可以调用将内容保存回文件。问题是如何以安全的方式执行此操作。 覆盖现有文件(开始写入原始文件)显然是不安全的。如果该方法在完成之前失败,则最终将写入一半的文件,并且您丢失了数据。 更好的选择是在某个位置写入 临时 文件,方法完成后, 将 临时文件 复制 到原始文件。 现在,

  • 我整晚都在做这个,但是什么也没做出来。我希望我的代码对用户输入的所有数字求和,计算用户输入数字的次数。然后计算平均值。然后找到最大值和最小值,很容易就对了。是的,如果我被允许使用数组,但这是为了复习,我讨厌while循环。 这是我的密码。 以下是输出结果: 请输入一个整数:3您的数字之和为:3.0输入的值数为:1 请输入一个整数:2数字之和为:5.0输入的数值个数为:2 请输入一个整数:1数字之和

  • 问题内容: 我发现几乎每个教程都告诉我针对事件循环执行此操作: 但是,单击X关闭程序会出现此消息。 这些示例建议使用无限循环,这的确使我感到奇怪。这听起来不自然,而我的其他X11程序也没有这样做。所以我四处搜寻。我发现了如何捕获窗口关闭事件。 那个有效。它退出没有错误。…但是我拒绝相信这是正常的做事方式。我的意思是,这是正确退出X11应用程序的唯一方法吗?捕获结束事件似乎需要做很多工作。如何进行“

  • 问题内容: 我的redis rdb文件的大小一直在增长,直到数据库无法运行并且连接被拒绝为止。我意识到这与某些配置设置有关-我使用的是默认配置文件。 有什么办法可以防止这种情况?我不必担心持续备份。 问题答案: 这显然在redis.conf中, 上面的文本在redis.conf中,如果您不想保存rdb文件,请在保存的三行注释,例如

  • 如果输入了非int值,如何创建一个会中断的while循环? 例如,如果用户输入字符串、double或int以外的其他基本类型,循环将退出。

  • 我有以下代码来下载通过TCP传输的文件: 一旦所有的字节都被处理了(它们总是被处理的,它像正常的一样工作,只是不退出循环),文件就被创建了,没有一个问题,但是,循环没有退出。