-8

以下のコードのみを修正してください。

ファイルにはすでにエントリが含まれています:1行目のユーザー名。2行目のパスワード。

3行目に書き込むために必要なチェックボックスのステータスであり、ファイル内のチェックボックスのステータス値のみを読み取るか変更する必要があります。

現在、このコードは、チェックボックスのステータス値の値がすでに存在する場合は機能しています。それ以外の場合は、UIがハングしています。

WriteCheckStatusToFile(BOOL& locVar)
{
    FILE *l_pFile = NULL;
    CString l_strRememberCheck;
    l_strRememberCheck = GetExePath() + _T("password");

    CString sVar;
    sVar.Format(_T("%d"),locVar);
    if(NULL != (l_pFile = fopen(l_strRememberCheck, _T("r+"))) )
    {
        int count = 0;
        char c;
        while(count != 2)
        {
            if((c = fgetc(l_pFile)) == '\n') count++;
        }
        fseek(l_pFile,ftell(l_pFile),SEEK_SET);
        fprintf(l_pFile, sVar);
    }
    l_strRememberCheck.ReleaseBuffer();
    fclose(l_pFile);
}

よろしくお願いします!
サム。

4

1 に答える 1

0

この行

fprintf(l_pFile, sVar);

正しく見えません。私はそれがすべきだと思います

fprintf(l_pFile, "%s\n", (LPCTSTR) sVar);

ファイルの改行が2つ未満の場合、ループは無限になる可能性があります。

while(count != 2)

私はそれがすべきだと思います:

while( (count < 2) && ( ! feof(l_pFile) ) && ( c != EOF ) )

おそらくエラーとは関係ありませんが、少なくともこのコードスニペットでは、CString :: GetBuffer()を呼び出していないため、CString :: ReleaseBuffer()を呼び出す必要はありません。

l_strRememberCheck.ReleaseBuffer();

この行は、ファイルポインタがすでにある場所へのfseek()に表示されるため、不要な場合があります。

fseek(l_pFile,ftell(l_pFile),SEEK_SET);

2行のファイルが「\n」で終了していない場合は、次のように印刷する必要があります。

   if ( count == 2 )
   {
      fprintf(l_pFile, "%s\n", (LPCTSTR) sVar);
   }
   else
   {
      fprintf(l_pFile, "\n%s\n", (LPCTSTR) sVar);
   }
于 2012-09-23T08:25:46.423 に答える