在EVC4.2下MFC修改的用来读取.ini文件的函数GetPrivateProfileString

来源:互联网 发布:文本相似度算法 svm 编辑:程序博客网 时间:2024/05/13 16:23

这两天在写老师要求的作业。是一个在EVC下开发的闹钟定制程序。其中一个难点就是如何创建、写、读一个ini 文件。由于是在EVC下,所以很多API函数都不被支持,比如关于.ini文件读写的GetPrivateProfileString和WritePrivateProfileString函数。于是我开始在网上搜寻可以轻松读写ini文件的方法。最后找到了一个人写好的,可以实现类似GetPrivateProfileString功能的函数。我在使用时,发现有一些bug,进行改动后,自己很轻松的使用上了。

GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName)。其中参数都是仿造真正的API函数入口参数入手的,但是我在使用中没有发现lpKeyName有任何作用。在我使用时用了个全局变量实现的lpKeyName。具体函数内容和我个人对他理解到的注解在下面,对我理解错误的地方请多指教。

 

DWORD CClockToolDlg::GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName)
{
 CFile iniFile;
 PBYTE pFileBuf;
 CString szBuf;
 DWORD dwLength;

 if (lpFileName == NULL || lpReturnedString == NULL)
 {  
  return 0;
 }
 *lpReturnedString = TCHAR('/0');
 nSize = 0;
 //打开文件不成问题
 if(!iniFile.Open(lpFileName, CFile::modeRead))
 {
  return 0;
 }
 dwLength = iniFile.GetLength();

 if (dwLength == 0)
 {
  return 0;
 }
 pFileBuf = new BYTE[dwLength + 2];
 if (pFileBuf == NULL)
 {
  return 0;
 }
 //初始化新分配的内存,设定初始值为0
 memset(pFileBuf, 0x0, dwLength + 2);
 iniFile.Read((void *)pFileBuf, dwLength);

 iniFile.Close();
 if (pFileBuf[0] == 0xFF && pFileBuf[1] == 0xFE)
 {
  szBuf = (LPCWSTR)(pFileBuf + 2);
 }
 else
 {
  PTCHAR pszWideChar = new TCHAR[dwLength + 1];
  MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS|MB_COMPOSITE|MB_USEGLYPHCHARS, (LPCSTR )pFileBuf, dwLength, pszWideChar,dwLength);

  //以下为我修改过的地方。因为我一点一点测试这个别人写的函数程序的时候,发现这里出了问题。于是我进行了修改,不过我认为我的修改并不好
  char string[500];
  int i=0;
  while(i<dwLength)
  {
   string[i]=pszWideChar[i];
   i++;
  }
  szBuf.Format(_T("%s"),string);
  //////////////

  delete pszWideChar;
 }
 delete pFileBuf;
 while (1)
 {
  CString szTemp;
  int nPos;
  if (szBuf.IsEmpty())
   goto _GetPrivateProfileString_EXIT;
  nPos = szBuf.FindOneOf(TEXT("/r/n"));

  if (nPos == -1)
  {
   szTemp = szBuf;
   szBuf.Empty();
   //szTemp='['
   //::AfxMessageBox(szTemp);
  }
  else
  {
   szTemp = szBuf.Left(nPos);
   szBuf = szBuf.Right(szBuf.GetLength() - nPos);
   szBuf.TrimLeft(TEXT("/r/n"));
  }
  szTemp.TrimLeft(TEXT("/t "));
  szTemp.TrimRight(TEXT("/t "));

  if (szTemp.GetAt(0) == TEXT('[') && szTemp.GetAt(szTemp.GetLength() - 1) == TEXT(']'))
  {
   szTemp = szTemp.Right(szTemp.GetLength() - 1);
   szTemp = szTemp.Left(szTemp.GetLength() - 1);
   如果没有[]
   if (lpAppName == NULL)
   {
    memcpy(lpReturnedString + nSize, (LPCTSTR)szTemp,(szTemp.GetLength() + 1)* sizeof(TCHAR));
    nSize += szTemp.GetLength() + 1;
   }
   //如果有[]
   else if(szTemp.Compare(lpAppName) == 0)
   {
    while (1)
    {
     if (szBuf.IsEmpty())
     {
      ///////////这里是我用来实现lpDefault功能的一个全局变量,呵呵
      hubo=1;
      ///////////

      goto _GetPrivateProfileString_EXIT;
     }
     nPos = szBuf.FindOneOf(TEXT("/r/n"));
     if (nPos == -1)
     {
      szTemp = szBuf;
      szBuf.Empty();
     }
     else
     {
      szTemp = szBuf.Left(nPos);
      szBuf = szBuf.Right(szBuf.GetLength() - nPos);
      szBuf.TrimLeft(TEXT("/r/n"));
     }
     nPos = szTemp.Find(TEXT("="));
     if (nPos == -1)
      goto _GetPrivateProfileString_EXIT;
     CString szTemp1;
     szTemp1 = szTemp.Left(nPos);
     szTemp1.TrimLeft(TEXT("/t "));
     szTemp1.TrimRight(TEXT("/t "));
     if (lpKeyName == NULL)
     {
      memcpy(lpReturnedString + nSize, (LPCTSTR)szTemp1,(szTemp1.GetLength() + 1)* sizeof(TCHAR));
      nSize += szTemp1.GetLength() + 1;
     }
     else if (szTemp1.Compare(lpKeyName) == 0)
     {
      szTemp1 = szTemp.Right(szTemp.GetLength() - nPos - 1);
      szTemp1.TrimLeft(TEXT("/t "));
      szTemp1.TrimRight(TEXT("/t "));
      memcpy(lpReturnedString + nSize, (LPCTSTR)szTemp1,(szTemp1.GetLength() + 1)* sizeof(TCHAR));
      nSize += szTemp1.GetLength() + 1;
      goto _GetPrivateProfileString_EXIT;
     }

///////////////////////////////////

    esle if(szTemp1.Compare(lpKeyName) != 0)

{

     hubo=1;

goto _GetPrivateProfileString_EXIT;

}

//////////////////////////////////
    }
   }
  }
 }
 _GetPrivateProfileString_EXIT:
 lpReturnedString[nSize] = TEXT('/0');
 return nSize;
}

原创粉丝点击