读ini文件时写了个类。出现问题。

cranley 2005-06-02 08:19:04
#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得到负值的字符(汉字);
请高手研究一下,谢谢


...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cranley 2005-06-13
  • 打赏
  • 举报
回复
没人帮我测试一下啊。这么久了。
cranley 2005-06-04
  • 打赏
  • 举报
回复
为负数应该不正常,因为我测试时用的都是ASCII
aben456 2005-06-02
  • 打赏
  • 举报
回复
getat为负数应该正常
cranley 2005-06-02
  • 打赏
  • 举报
回复
请各位研究一下呵。
对你我都有帮助
xmxjh 2005-06-02
  • 打赏
  • 举报
回复
我觉得如果不是练习数据据结构的话,用API非常方便
GetPrivateProfileString("BOX",sKeyWord,"",sIMEI,nSize,FileName);//读字符串
GetPrivateProfileInt("BOX","NO",0,FileName);//读整型值
Kudeet 2005-06-02
  • 打赏
  • 举报
回复
http://dev.csdn.net/develop/article/25/25860.shtm
http://dev.csdn.net/develop/article/26/26342.shtm

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧