读ini文件时写了个类。出现问题。
#include "StdAfx.h"
#include ".\ini.h"
CIni::CIni(CString filepathname)
{
m_file.Open(filepathname,CFile::modeReadWrite);
bool ok=true;
if(m_file.m_hFile==(HANDLE)-1)
{
if(!m_file.Open(filepathname,CFile::modeCreate|CFile::modeReadWrite))
ok=false;
}
if(ok)
{
CString str;
while(m_file.ReadString(str))
{
if(str!="")
m_fileContent.Add(str);
}
}
m_index=-1;
}
CIni::~CIni(void)
{
if(m_file.m_hFile!=(HANDLE)-1)
{
m_file.SeekToBegin();
for(int i=0;i<m_fileContent.GetSize();i++)
{
CString str;
str=m_fileContent.GetAt(i);
str.Trim();
if(!Test(str))
AfxMessageBox(str);
str+='\012';
m_file.WriteString(str);
}
m_file.Close();
}
}
bool CIni::SetIndex(CString indexname,bool bCreate)
{
if(indexname=="")
return false;
if(m_file.m_hFile==(HANDLE)-1)
return false;
CString str;
for(int i=0;i<m_fileContent.GetSize();i++)
{
CString str=m_fileContent.GetAt(i);
int start=str.Find("[");
int end=str.Find("]");
if(start<0||end<0)continue;
CString indextemp=str.Mid(start+1,end-start-1);
if(indextemp=="")
return false;
CString indexname1=indexname.MakeUpper();
CString indextemp1=indextemp.MakeUpper();
if(!indextemp1.Compare(indexname1))
{
m_index=i+1;
CString temp;
temp.Format("%d",m_index);
return true;
}
}
if(bCreate)
{
CString temp="[";
temp+=indexname;
temp+="]";
m_fileContent.Add(temp);
if(i!=0)
m_index=i;
else
m_index=1;
return true;
}
return false;
}
CString CIni::ReadString(CString strparam)
{
if(m_file.m_hFile==(HANDLE)-1)
return NULL;
if(m_index==-1)
{
AfxMessageBox("索引值为空");
return NULL;
}
CString str;
for(int i=m_index;i<m_fileContent.GetSize();i++)
{
CString str=m_fileContent.GetAt(i);
if(str.Find("[")>-1)
{
return NULL;
}
int index=str.Find("=");
if(index<1)
continue;
CString right=str.Mid(index+1,str.GetLength()-index-1);
CString left=str.Mid(0,index);
if(!left.Compare(strparam))
{
return right;
}
}
return NULL;
}
int CIni::ReadNumber(CString strparam)
{
CString str;
str=ReadString(strparam);
if(str=="")
return NULL;
return atoi(str);
}
bool CIni::WriteString(CString paramname,CString value)
{
CString temp1;
temp1.Format(" WriteString %d\n",value.GetLength());
TRACE(value+temp1);
if(m_file.m_hFile==(HANDLE)-1)
return false;
if(m_index==-1)
{
AfxMessageBox("索引值为空");
return false;
}
CString str;
CString laststr;
CString result=paramname;
result+="=";
result+=value;
for(int i=m_index;i<m_fileContent.GetSize();i++)
{
CString str=m_fileContent.GetAt(i);
if(str.Find("[")>-1)
{
CString temp;
temp.Format("%d",m_index);
temp+=" "+result;
m_fileContent.InsertAt(m_index,result);
return true;
}
int index=str.Find("=");
if(index<1)
continue;
CString left=str.Mid(0,index);
if(!left.Compare(paramname))
{
m_fileContent.RemoveAt(i);
m_fileContent.InsertAt(i,result);
CString temp;
temp.Format("%d",result.GetLength());
temp+=" "+result;
TRACE(temp);
return true;
}
}
CString temp;
temp.Format("%d",m_index);
temp+=" "+result;
m_fileContent.InsertAt(m_index,result);
return true;
}
bool CIni::WriteNumber(CString paramname,int value)
{
CString result;
result.Format("%d",value);
return WriteString(paramname,result);
}
bool CIni::Test(CString str)//测试函数
{
bool ret=true;
for(int i=0;i<str.GetLength();i++)
{
int d=str.GetAt(i);
TRACE((char)d+" ");
if(d<0||d==10||d==13)
ret=false;
}
return ret;
}
以上是这个类的CPP代码。H代码就没有必要了。
使用时,经常出现"\r" "\0"符号的捣乱。甚至出现用GetAt得到负值的字符(汉字);
请高手研究一下,谢谢