C中的文件读取问题

时间:2013-06-17 13:17:05

标签: c file-io fopen printf

我在读取和写入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;
   }

1 个答案:

答案 0 :(得分:1)

很难从代码中解释错误。请检查可能存在未关闭状态的路径的问题。但是这个程序不需要多次打开和关闭。您可以打开一次并最后关闭。如果需要在循环中中止其余操作,请在'fclose(fileFd)'之后使用continue关键字。或者最后循环后你可以使用

if(fileFd != NULL)
    fclose(fileFd);