我想用.ini进行一个简单用户管理!需要一些指导和示例·各位帮忙啊 !
解决方案 »
- 想问下3D模型都有些什么格式啊?
- 将bmp图像绘制到多个picture上出现问题,为什么呢?
- 对于 《ADO操作access全过程和CListCtrl的用法》不理解的地方 请指教。
- 如何知道弹出窗体要打开的URL?
- 高手指点 实现类似Photoshop中<透底>或<背景透明>功能的算法。分不够可在加
- 为什么做ISAPI就可以这么高工资啊-薪水范围8000-9999
- 关于MessageBox的一个问题
- 在Win32 console里是不是不能用CFileFind , CString这些类呀?
- CFile pFile的pFile.Read(pbuf,145)在循环中会跳出导致死循环的问题???急问
- 创建超大的位图,求版主以及技术牛人前来探讨!
- 请教如何使自定义基于cwnd的类响应鼠标拖动改变大小
- 音频编程及录音高手看一看,如何结束录音设备??????一个复杂的问题
http://www.codeproject.com/cpp/ciniex.asp
http://www.yesky.com/20020123/215181.shtml
GetPrivateProfileString();
GetPrivateProfileInt();
主要是这几个函数了!
{
const char *filename=strScadPath+"writetxt.ini";
CString strFileName=strScadPath+"writetxt.ini";
CFile file;
const char *section="SYSTEMINFO";
const char *key1="LoadDate";
const char *defaultstring1="10";
m_sysLoadDay=10;
const char *key2="ShowPreview";
const char *defaultstring2="Y";
m_sysShowPreview=true;
const char *key3="AtuoDeleteDay";
const char *defaultstring3="60";
m_sysAutoDeleteDay=60;
if(file.Open(strFileName,CFile::modeWrite))
{
file.Close();
char buffer[10];
CString temp;
GetPrivateProfileString(section,key1,defaultstring1,buffer,10,filename);
int i=0;
while(buffer[i]!=NULL&&i<10)
{
temp+=buffer[i];
i++;
}
m_sysLoadDay=atoi(temp);
temp="";
GetPrivateProfileString(section,key2,defaultstring2,buffer,10,filename);
i=0;
while(buffer[i]!=NULL&&i<10)
{
temp+=buffer[i];
i++;
}
//AfxMessageBox(temp);
if(strcmp(temp,"Y")==0)
m_sysShowPreview=true;
else
m_sysShowPreview=false;
temp="";
GetPrivateProfileString(section,key3,defaultstring3,buffer,10,filename);
i=0;
while(buffer[i]!=NULL&&i<10)
{
temp+=buffer[i];
i++;
}
m_sysAutoDeleteDay=atoi(temp);
}
else
{
if(file.Open(strFileName,CFile::modeCreate))
{
file.Close();
WritePrivateProfileString(section,key1,defaultstring1,filename);
WritePrivateProfileString(section,key2,defaultstring2,filename);
WritePrivateProfileString(section,key3,defaultstring3,filename);
}
}
}
{
m_sysAutoDeleteDay=intDelDay;
m_sysLoadDay=intLoadDay;
m_sysShowPreview=blnPre;
const char *filename=strScadPath+"writetxt.ini";
CString strFileName=strScadPath+"writetxt.ini";
CFile file;
CString temp1,temp2;
const char *section="SYSTEMINFO";
const char *key1="LoadDate";
temp1.Format("%s%d","",intLoadDay);
const char *defaultstring1=temp1;
const char *key2="ShowPreview";
const char *defaultstring2="Y";
if(!blnPre)
defaultstring2="N"; const char *key3="AtuoDeleteDay";
temp2.Format("%s%d","",intDelDay);
const char *defaultstring3=temp2;
if(file.Open(strFileName,CFile::modeCreate))
{
file.Close();
WritePrivateProfileString(section,key1,defaultstring1,filename);
WritePrivateProfileString(section,key2,defaultstring2,filename);
WritePrivateProfileString(section,key3,defaultstring3,filename);
}
}
{
m_sysAutoDeleteDay=intDelDay;
m_sysLoadDay=intLoadDay;
m_sysShowPreview=blnPre;
const char *filename=strScadPath+"writetxt.ini";
CString strFileName=strScadPath+"writetxt.ini";
CFile file;
CString temp1,temp2;
const char *section="SYSTEMINFO";
const char *key1="LoadDate";
temp1.Format("%s%d","",intLoadDay);
const char *defaultstring1=temp1;
const char *key2="ShowPreview";
const char *defaultstring2="Y";
if(!blnPre)
defaultstring2="N"; const char *key3="AtuoDeleteDay";
temp2.Format("%s%d","",intDelDay);
const char *defaultstring3=temp2;
if(file.Open(strFileName,CFile::modeCreate))
{
file.Close();
WritePrivateProfileString(section,key1,defaultstring1,filename);
WritePrivateProfileString(section,key2,defaultstring2,filename);
WritePrivateProfileString(section,key3,defaultstring3,filename);
}
}
ini.h:
//********************************************
// Ini 相关函数
//********************************************#ifndef _ROBOT_PET_INI_H_
#define _ROBOT_PET_INI_H_#define ERROR_DATA -99999999//配置文件类
class CIni{
private:
char FileName[MAX_PATH];//文件名
int DataLen; //文件长度
char *Data; //文件内容 int IndexNum; //索引数目([]的数目)
int *IndexList; //索引点位置列表 int Point; //当前指针
int Line, Word; //当前行列public:
CIni();
CIni(char *); //初始化打开配置文件
~CIni(); //释放内存
char *GetData(); //返回文件内容
int GetLines(int); //返回文件的行数 bool Open(char *); //打开配置文件
bool OpenInResource(int Id); //从资源中读取
void Close(); //关闭配置文件
bool Save(char *filename=NULL); //保存配置文件private:
void InitIndex(); //初始化索引
int FindIndex(char *); //返回标题位置
int FindData(int, char *); //返回数据位置
int GotoNextLine(int); //提行
char *ReadDataName(int &); //在指定位置读一数据名称
char *ReadText(int); //在指定位置读字符串 bool AddIndex(char *); //加入一个索引
bool AddData(int, char *, char *); //在当前位置加入一个数据
bool ModityData(int, char *, char *); //在当前位置修改一个数据的值public:
int ReadInt(char *, char *); //读一个整数
int ReadInt(char *, int ); //在指定的行读一整数 char *ReadText(char *, char *); //读一个字符串
char *ReadText(char *, int); //在指定的行读一字符串 char *ReadCaption(char *, int); //在指定行读一字符名称 bool Write(char *, char *, int); //写一个整数
bool Write(char *, char *, char *); //写一个字符串 int GetContinueDataNum(char *); //返回连续的行数(从INDEX到第一个空行)
};#endif
/////////ini.cpp
//********************************************
// Ini 相关函数
//********************************************#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <io.h>
#include <fcntl.h>
#include "tools.h"
#include "ini.h"
#include <assert.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif//初始化
CIni::CIni()
{
DataLen=0;
Data=NULL;
IndexNum=0;
IndexList=NULL;
}//初始化
CIni::CIni(char *filename)
{
DataLen=0;
Data=NULL;
IndexNum=0;
IndexList=NULL;
Open(filename);
}//析构释放
CIni::~CIni()
{
if( DataLen != 0 )
{
SAFE_DELETE( Data );
DataLen = 0;
} if( IndexNum != 0 )
{
SAFE_DELETE( IndexList );
IndexNum = 0;
}
}//读入文件
bool CIni::Open(char *filename)
{
strcpy(FileName, filename); SAFE_FREE( Data ); DataLen=GetFileLength(filename); //获取文件长度
if( DataLen > 0 ) //文件存在
{
Data=new char[DataLen]; FILE *fp;
fp=fopen(filename, "rb");
assert( fp!=NULL );
fread(Data, DataLen, 1, fp); //读数据
fclose(fp); //初始化索引
InitIndex();
}
else
{
DataLen=1;
Data=new char[DataLen];
memset(Data, 0, 1);
InitIndex();
} return false;
}//从资源中读取
bool CIni::OpenInResource(int Id)
{
CString str;
str.LoadString(Id);
DataLen = str.GetLength(); //释放以前的
SAFE_FREE( Data ); Data=new char[DataLen];
memset(Data, 0, DataLen); //读数据
strcpy(Data, str); //初始化索引
InitIndex(); return true;
}//关闭文件
void CIni::Close()
{
if( DataLen != 0 )
{
SAFE_DELETE( Data );
DataLen = 0;
} if( IndexNum != 0 )
{
SAFE_DELETE( IndexList );
IndexNum = 0;
}
}//写入文件
bool CIni::Save(char *filename)
{
if( filename==NULL )
filename=FileName; FILE *fp;
fp=fopen(filename, "wb");
assert( fp!=NULL ); //fprintf(fp,"%s",Data);
fwrite(Data, DataLen, 1, fp);
fclose(fp); return true;
}//计算出所有的索引位置
void CIni::InitIndex()
{
IndexNum=0; for(int i=0; i<DataLen; i++)
{
//找到
if( Data[i]=='[' && (Data[i-1]=='\n' || i==0) )
{
IndexNum++;
}
} //申请内存
SAFE_DELETE( IndexList );
if( IndexNum>0 )
IndexList=new int[IndexNum]; int n=0; for(i=0; i<DataLen; i++)
{
if( Data[i]=='[' && (Data[i-1]=='\n' || i==0) )
{
IndexList[n]=i+1;
n++;
}
}
}/////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////返回指定标题位置
int CIni::FindIndex(char *string)
{
for(int i=0; i<IndexNum; i++)
{
char *str=ReadText( IndexList[i] );
if( strcmp(string, str) == 0 )
{
SAFE_FREE( str );
return IndexList[i];
}
SAFE_FREE( str );
}
return -1;
}//返回指定数据的位置
int CIni::FindData(int index, char *string)
{
int p=index; //指针 while(1)
{
p=GotoNextLine(p);
char *name=ReadDataName(p);
if( strcmp(string, name)==0 )
{
SAFE_FREE( name );
return p;
} SAFE_FREE( name );
if( p>=DataLen ) return -1;
}
return -1;
}//提行
int CIni::GotoNextLine(int p)
{
for(int i=p; i<DataLen; i++)
{
if( Data[i]=='\n' )
return i+1;
}
return i;
}//在指定位置读一数据名称
char *CIni::ReadDataName(int &p)
{
char chr;
char *Ret;
int m=0; Ret=(char *)malloc(64);
memset(Ret, 0, 64); for(int i=p; i<DataLen; i++)
{
chr=Data[i]; //结束
if( chr == '\r' )
{
p=i+1;
return Ret;
}
//结束
if( chr == '=' || chr == ';' )
{
p=i+1;
return Ret;
}
Ret[m]=chr;
m++;
}
return Ret;
}//在指定位置读一字符串
char *CIni::ReadText(int p)
{
char chr;
char *Ret;
int n=p, m=0; int EndLine=GotoNextLine(p);
Ret=(char *)malloc(EndLine-p+1);
memset(Ret, 0, EndLine-p+1); for(int i=0; i<DataLen-p; i++)
{
chr=Data[n]; //结束
if( chr == ';' || chr == '\r' || chr == '\t' || chr == ']' || chr == '\n')
{
//ShowMessage(Ret);
return Ret;
}
Ret[m]=chr;
m++;
n++;
}
return Ret;
}/////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////加入一个索引
bool CIni::AddIndex(char *index)
{
char str[256];
memset(str, 0, 256);
int n=FindIndex(index); if( n == -1 ) //新建索引
{
sprintf(str,"\r\n[%s]\r\n",index);
Data=(char *)realloc(Data, DataLen+strlen(str)); //重新分配内存
sprintf(&Data[DataLen], "%s", str);
DataLen+=strlen(str); InitIndex();
return true;
}
return false; //已经存在
}//在当前位置加入一个数据
bool CIni::AddData(int p, char *name, char *string)
{
char *str;
int len=strlen(string);
str=new char[len+256];
memset(str, 0, len+256);
sprintf(str,"%s=%s\r\n",name,string);
len=strlen(str); p=GotoNextLine(p); //提行
Data=(char *)realloc(Data, DataLen+len); //重新分配内存 char *temp=new char[DataLen-p];
memcpy(temp, &Data[p], DataLen-p);
memcpy(&Data[p+len], temp, DataLen-p); //把后面的搬到末尾
memcpy(&Data[p], str, len);
DataLen+=len; SAFE_DELETE( temp );
SAFE_DELETE( str );
return true;
}
//在当前位置修改一个数据的值
bool CIni::ModityData(int p, char *name, char *string)
{
int n=FindData(p, name); char *t=ReadText(n);
p=n+strlen(t);
if( strlen(t)>0 ) free(t); int newlen=strlen(string);
int oldlen=p-n; Data=(char *)realloc(Data, DataLen+newlen-oldlen); //重新分配内存 char *temp=new char[DataLen-p];
memcpy(temp, &Data[p], DataLen-p);
memcpy(&Data[n+newlen], temp, DataLen-p); //把后面的搬到末尾
memcpy(&Data[n], string, newlen);
DataLen+=newlen-oldlen; SAFE_DELETE( temp );
return true;
}//返回文件内容
char *CIni::GetData()
{
return Data;
}//获得文件的行数
int CIni::GetLines(int cur)
{
int n=1;
for(int i=0; i<cur; i++)
{
if( Data[i]=='\n' )
n++;
}
return n;
}/////////////////////////////////////////////////////////////////////
// 对外接口
///////////////////////////////////////////////////////////////////////以普通方式读一字符串数据
char *CIni::ReadText(char *index, char *name)
{
int n=FindIndex(index);
assert( n != -1 ); int m=FindData(n, name);
assert( m != -1 ); return ReadText(m);
}
//在指定的行读一字符串
char *CIni::ReadText(char *index, int lines)
{
int n=FindIndex(index);
assert( n != -1 ); //跳到指定行数
n=GotoNextLine(n);
for(int i=0; i<lines; i++)
{
if( n<DataLen )
n=GotoNextLine(n);
} //读数据
while( n<=DataLen )
{
if( Data[n] == '=' )
{
n++;
return ReadText(n);
}
if( Data[n] == '\r' )
{
return "";
}
n++;
} return "";
}//以普通方式读一整数
int CIni::ReadInt(char *index, char *name)
{
int n=FindIndex(index);
assert( n != -1 ); int m=FindData(n, name);
assert( m != -1 ); char *str=ReadText(m);
int ret=atoi(str);
free(str);
return ret;
}//在指定的行读一整数
int CIni::ReadInt(char *index, int lines)
{
int n=FindIndex(index);
assert( n != -1 ); //跳到指定行数
n=GotoNextLine(n);
for(int i=0; i<lines; i++)
{
if( n<DataLen )
n=GotoNextLine(n);
} //读数据
while( n<DataLen )
{
if( Data[n] == '=' )
{
n++;
char *str=ReadText(n);
int ret=atoi(str);
free(str);
return ret;
}
if( Data[n] == '\r' )
{
return ERROR_DATA;
}
n++;
} return ERROR_DATA;
}//在指定的行读一数据名称
char *CIni::ReadCaption(char *index, int lines)
{
int n=FindIndex(index);
assert( n != -1 ); //跳到指定行数
n=GotoNextLine(n);
for(int i=0; i<lines; i++)
{
if( n<DataLen )
n=GotoNextLine(n);
} return ReadDataName(n);
}//以普通方式写一字符串数据
bool CIni::Write(char *index, char *name, char *string)
{
int n=FindIndex(index);
if( n == -1 ) //新建索引
{
AddIndex(index);
n=FindIndex(index);
AddData(n, name, string); //在当前位置n加一个数据
return true;
} //存在索引
int m=FindData(n, name);
if( m==-1 ) //新建数据
{
AddData(n, name, string); //在当前位置n加一个数据
return true;
} //存在数据
ModityData(n, name, string); //修改一个数据 return true;
}//以普通方式写一整数
bool CIni::Write(char *index, char *name, int num)
{
char string[32];
sprintf(string, "%d", num); int n=FindIndex(index);
if( n == -1 ) //新建索引
{
AddIndex(index);
n=FindIndex(index);
AddData(n, name, string); //在当前位置n加一个数据
return true;
} //存在索引
int m=FindData(n, name);
if( m==-1 ) //新建数据
{
AddData(n, name, string); //在当前位置n加一个数据
return true;
} //存在数据
ModityData(n, name, string); //修改一个数据 return true;
}//返回连续的行数
int CIni::GetContinueDataNum(char *index)
{
int num=0;
int n=FindIndex(index);
n=GotoNextLine(n);
while(1)
{
if( Data[n] == '\r' || Data[n] == EOF || Data[n] == -3 || Data[n] == ' ' || Data[n] == '/' || Data[n] == '\t' || Data[n] == '\n' )
{
return num;
}
else
{
num++;
n=GotoNextLine(n);
if( n >= DataLen ) return num;
}
}
}