【问题标题】:How to Read and write into/from a text file?如何读取和写入/写入文本文件?
【发布时间】:2012-09-15 00:57:37
【问题描述】:

请更正以下代码:仅限。

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

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

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

提前感谢大家!
山姆

【问题讨论】:

  • sVar 看起来不像 C 字符串。
  • 这是什么语言? BOOLCString 是如何定义的?
  • C++C 是非常不同的语言,两个标签都不能应用。请只为您的问题使用正确的标签,不要随意选择它们。
  • @epsalon 这是 Windows 代码,在 MFC 或 ATL 下。这两天都有CString。
  • @user1610015 CString 当然是 MFC 类,C-String 是以空字符结尾的字符数组。 fprintf 函数对 CString 类一无所知。它只能采用 C-String(数组)。我试图标记错误。

标签: windows mfc atl


【解决方案1】:

这一行

fprintf(l_pFile, sVar);

看起来不对。我觉得应该是

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

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

while(count != 2)

我认为应该是:

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

可能与您的错误无关,但是 - 至少对于这段代码 sn-p - 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);
   }

【讨论】:

  • 我按照您的建议对代码进行了更改,但复选框状态始终添加在第二行,因此密码不匹配。需要在文本文件的第三行添加。请再次检查逻辑。
  • 我的怀疑是当你有一个双行文件时,第二行不会以'\n'结尾。你可以添加这个 if 来包装你的 fprintf: if ( count == 2 ) fprintf(l_pFile,"%s\n",sVar);否则 fprintf(l_pFile,"\n%s\n",sVar);
  • 忘记了 (LPCTSTR)。更正在上面的答案中。
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
相关资源
最近更新 更多