我想用.ini进行一个简单用户管理!需要一些指导和示例·各位帮忙啊 !

解决方案 »

  1.   

    ini class
    http://www.codeproject.com/cpp/ciniex.asp
      

  2.   

    用Visual C++操作INI文件
    http://www.yesky.com/20020123/215181.shtml
      

  3.   

    http://www.codeproject.com/cpp/ciniex.asp
      

  4.   

    http://www.yesky.com/20020123/215181.shtml
      

  5.   

    WritePrivateProfileString();
    GetPrivateProfileString();
    GetPrivateProfileInt();
    主要是这几个函数了!
      

  6.   

    void CWritetxtDlg::ReadFromini()
    {
    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);
    }
    }
    }
      

  7.   

    void CWritetxtDlg::WriteToini(int intLoadDay, int intDelDay, bool blnPre)
    {
    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);
        } 
    }
      

  8.   

    void CWritetxtDlg::WriteToini(int intLoadDay, int intDelDay, bool blnPre)
    {
    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);
        } 
    }
      

  9.   

    贴子太长分两次:
    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
      

  10.   

    还是太长:分两次
    /////////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;
    }
      

  11.   


    //在当前位置修改一个数据的值
    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;
    }
    }
    }