gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:37:07 26 4
gpt4 key购买 nike

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

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;
}

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

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

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

关于c - 如何在处理不断增长的输入文件时安全地退出循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57271721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com