-8

请更正以下代码:仅。

文件已包含条目:第一行用户名;第二行密码。

写入第三行所需的复选框状态,并且只需要读取或更改文件中的复选框状态值。

目前,如果复选框状态值已经有一个值,则此代码正在工作,然后它正在覆盖,否则 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);

如果文件的换行符少于两个,则循环可能会变为无限:

while(count != 2)

我认为应该是:

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

可能与您的错误无关,但是 - 至少对于此代码片段 - 不需要调用 CString::ReleaseBuffer(),因为您没有调用 CString::GetBuffer()。

l_strRememberCheck.ReleaseBuffer();

此行可能是不必要的,因为 fseek() 似乎指向文件指针所在的位置:

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

如果两行文件没有以 '\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 回答