1

C でファイルを読み書きするときにランダムな不具合が発生します。通常、アルゴリズムは正しく機能しますが、使用しているループが機能しなくなる場所で問題が発生することがあります。

私が使用しているファイルは、それから読み書きした後、[不完全な最終行] 1行、2文字、VIで表示されますが、これは機能しているときの様子です。ファイル内の値を追跡し、関数が実行されるたびにカウントダウンしています。ただし、ループがフリーズすると、ファイルに 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;
   }
4

1 に答える 1

1

コードからエラーを説明するのは非常に困難です。閉じていない状態のパスが存在する可能性があることを確認してください。しかし、このプログラムは何度も開いたり閉じたりする必要はありません。一度開いて最後に閉じることができます。残りの操作をループで中止する必要がある場合は、continue'fclose(fileFd)' の後にキーワードを使用します。または最後にループ後に使用できます

if(fileFd != NULL)
    fclose(fileFd);
于 2013-06-17T15:07:13.743 に答える