我在读取和写入C文件时会出现一些随机故障。通常情况下,算法工作正常,但偶尔我会对我正在使用的循环停止工作的位置打嗝。
我正在使用的文件,在阅读和写入之后,说[不完整的最后一行] 1行,当我VI时它是2个字符,但这就是它工作时的样子。我正在跟踪文件中的值,并在每次执行函数时使用它进行倒计时。然而,当循环冻结时,我VI文件,它读取1行,3个字符,没有提到不完整的最后一行。如果文件没有被不完整的行读取是有意义的,但这是它实际工作的唯一情况。
我通常可以通过删除文件并让程序重新创建它来解决这个问题,但这应该是在监视应用程序中,所以我需要完全消除故障。我正在使用fprintf和fgets来读取和写入文件,据我所知,他们应该正确终止文件,或者我错了?任何帮助将非常感激。谢谢,全部。
我附上我为下面的整个算法编写的代码:
if loop executes ->
{
/*Set countdown timer for outage, only email after down for 24 hours. */
if( access( filePath, F_OK ) != -1 ) /* If file does not exist */
{
/* Does exist so do nothing */
}
else
{
if ( ( fileFd = fopen( filePath, "w" ) ) != 0 )
{
/* Generates file */
}
fclose(fileFd);
if ( ( fileFd = fopen( filePath, "r+" ) ) != 0 )
{
fprintf(fileFd, "%d", bridgeTimer_limit); /* Reset timer to default countdown */
rewind(fileFd);
fgets(bridgeOneTimeLeft, 10, fileFd);
bridgeOneDownCount = atoi(bridgeOneTimeLeft);
}
}
fclose(fileFd);
if ( ( fileFd = fopen( filePath, "r+" ) ) != 0 )
{
fgets(bridgeOneTimeLeft, 10, fileFd);
rewind(fileFd);
bridgeOneDownCount = atoi(bridgeOneTimeLeft);
if (bridgeOneDownCount > 0) /* Timer still counting down */
{
/* Continue timer countdown, decrementing 15 minutes per count */
bridgeOneDownCount = bridgeOneDownCount - 1;
fprintf(fileFd, "%d" , bridgeOneDownCount);
rewind(fileFd);
pinfo(("bridgeOneDownCount counting down == %d", bridgeOneDownCount));
}
else if (bridgeOneDownCount - 1 <= 0) /* Time reaches 0 */
{
sprintf(cmd2,"`which send_alert_email` \'%s\' ", reasonText);
system(cmd2);
}
fclose(fileFd);
}
}
}
else
{
if ( ( fileFd = fopen( filePath, "r+" ) ) != 0 )
{
fprintf(fileFd, "%d", bridgeTimer_limit); /* Reset timer to default countdown */
rewind(fileFd);
fgets(bridgeOneTimeLeft, 10, fileFd);
bridgeOneDownCount = atoi(bridgeOneTimeLeft);
}
fclose(fileFd);
return;
}
答案 0 :(得分:1)
很难从代码中解释错误。请检查可能存在未关闭状态的路径的问题。但是这个程序不需要多次打开和关闭。您可以打开一次并最后关闭。如果需要在循环中中止其余操作,请在'fclose(fileFd)'之后使用continue
关键字。或者最后循环后你可以使用
if(fileFd != NULL)
fclose(fileFd);