如何在处理不断增长的输入文件时安全地退出循环? [英] 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>
",
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屋!
查看全文