zoukankan      html  css  js  c++  java
  • C++读取INI文件

    VC++中 3 个主要 写入/读取配置文件ini的函数
    bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);
    写入.ini文件;
     
    DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);

    读取.ini文件;

    UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);

    读取整形值。

    其中个参数的意思:

    LPCTSTR lpAppName      ------- INI文件中的一个字段名

    LPCTSTR lpKeyName      ------- lpAppName 下的一个键名,也就是里面具体的变量名

    LPCTSTR lpString       ------- 是键值,也就是变量的值, 必须为LPCTSTR或CString类型

    LPCTSTR lpFileName     ------- 完整的INI文件路径名

    LPCTSTR lpDefaut       ------- 如果没有其前两个参数值,则将此值赋给变量

    LPSTR lpReturnedString ------- 接收INI文件中的值的CString对象,即接收缓冲区

    DWORD nSize            ------- 接收缓冲区的大小

    例子

    CString StrName,Strtemp;

    int nAge;

    StrName = "jacky";

    nAge = 13;

    WritePrivateProfileString("Student","Name",StrName,"c:\setting.ini");

    结果:(INI文件中显示如下:)

    [Student]

    Name=jacky

    读取:

    CString SName;

    GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\setting.ini");

    结果:SName = "jacky";这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。

    读整数比较简单,如下

    int Result = GetPrivateProfileInt("Student","nAge",0,"c:\setting.ini")返回值即为所读取的结果!

    GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。

    原代码如下:

    CString server_ip;
    CString des="";
    ::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
    des.ReleaseBuffer();
    des+="\config.ini";
    GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
    server_ip.ReleaseBuffer();

    注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作

    更多说明

    获取路径

    GetCurrentDirectory只是返回当前进程的当前目录,而并不是进程的镜像文件(.exe)所在的目录
    GetCurrentDirectory()适用于XP等系统,在WinCE上不能使用
    GetModuleFileName()适用于WinCE2.0以后
    使用方法:
    //下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录
    {
        CString path;
        GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
        path.ReleaseBuffer();
        int pos = path.ReverseFind('\');
        path = path.Left(pos);
    }

    GetModuleFileName函数

    WINAPI DWORD GetModuleFileName(
      HMODULE hModule,
      LPWSTR lpFilename,
      DWORD nSize
    );

          GetBufferReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾),
    ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题: 如果要保存的字符串为abc(0结尾),则GetBuffer参数应至少
    为3; 如果要保存的内容不是以0结尾, 比如是读取文件数据, 则GetBuffer参数如果大于文件长度时,ReleaseBuffer参数一定要为文件长度(如果
    GetBuffer参数为文件长度的话不存在问题,ReleaseBuffer参数可以为默认-1)!
     GetBufferSetLength相对比较容易理解, 它申请一个指定长度的空间, 即使里面最终保存的字符串长度小于申请的空间长度, 也不会将多余空间释放.

    __________________________________________________________________________________________________________________DWORDGetCurrentDirectory(
      DWORD nBufferLength,
      LPTSTR lpBuffer
    );The GetCurrentDirectory function retrieves the current directory for the current process.GetCurrentDirectory返回当前进程的当前目录,并不一定返回你的应用程序的目录。如果你在应用程序中调用了打开文件对话框,你选择了一个文件,那么,这个文件所在的目录就成了当前进程的当前目录了。Parameters
    nBufferLength: 接收保存路径的字符串缓存长度, 缓存必须有一个保存结束的空字符的位置.
    lpBuffer:指向接收字符串的缓存,收到的非空字符串指定了当前目录的绝对路径.
    DWORD GetModuleFileName(
      HMODULE hModule,
      LPTSTR lpFilename,
      DWORD nSize
    );
    GetModuleFileName 函数指定当前进程模块的路径.它仅仅操作当前进程下的模块.如果想获取其他进程下的模块信息, 则需使用 GetModuleFileNameEx 函数.Parameters
    hModule:模块的句柄,或者设置为NULL表示当前模块。
    lpFilename:保存路径的缓冲区。
    nSize:缓冲区的大小。
    例子: TCHAR strExePath[_MAX_PATH];
     GetModuleFileName(NULL,strExePath,_MAX_PATH); PathRemoveFileSpec(strExePath);如果当前执行程序的位置为c: est.exe,GetModuleFileName获取的strExePath即为c: est.ext,通过去掉名称函数最终获得的strExePath为c:。(注意PathRemoveFileSpec 系统API函数调用时必须包含#include  "Shlwapi.h"作为头文件) TCHAR strExePath[_MAX_PATH];
     GetCurrentDirectory(_MAX_PATH, strExePath); 获取当前的系统目录,可能是c:也可能是其他值。

    ------------------------------------------------------------------------------------------------------

    shlwapi.dll
      shlwapi - shlwapi.dll - DLL文件信息

      DLL 文件: shlwapi 或者 shlwapi.dll

      DLL 名称: Microsoft Shell Light-weight Utility Library

      描述:   shlwapi.dll是UNC和URL地址动态链接库文件,用于注册键值和色彩设置。

      属于: Microsoft Windows Shell

      系统 DLL文件: 是

      常见错误: File Not Found, Missing File, Exception Errors

      安全等级 (0-5): 0   间谍软件: 否   广告软件: 否
    VC中使用GetModuleFileName获取应用程序路径

    .\与API函数GetModuleFileName获取应用程序目录有何不一样?
    采用.\也能获得应用程序目录,采用GetModuleFileName也能获得,二者有何不同?
    一样!
    一个是相对路径,一个是绝对路径
    .\是得到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。
    GetModuleFileName()得到模块的完整路径名,例如,你载入c:windowssystem32a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。
    .\一般用在包含头文件的语句中。
    另一个是程序编译后起作用的,例如,打开自定义的配置文件等。
    如何去取得这个Hanlde?
    如果你直接用LoadLibrary()或AfxLoadLibrary()载入dll,该函数返回值就是handle
    如果你隐式载入dll, 用GetModuleHandle("dll文件名")也可以得到handle;
    MFC程序得到本身路径

    在开发工程中,往往需要知道当前程序本身所在目录。
    一种方法是在程序安装的时候利用安装程序把文件路径写入注册表。在较大的程序中,这种方法比较常用
    另一种,就是在程序得到路径。这样,程序随便移动到哪里,都可以得到正确的路径。这也是本文介绍的方法。

    方法一:
    [code]
    //得到帮助文件的路径
    CString strFullName = AfxGetApp()->m_pszHelpFilePath;
    //得到的是:X:XXXXXXX.hlp

    //解析路径,得到当前运行程序所在目录
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];

    _splitpath(strAppName, drive, dir, NULL,NULL);
    CString strPath;
    strPath.Format("%s%s", drive, dir);
    //strPath即为得到的当前运行程序所在目录
    [/code]
    另外,AfxGetApp()->m_pszAppName 得到应用程序名称
    AfxGetApp()->m_pszExeName 得到程序文件名,不包括扩展名

    方法二:
    得到全路径
    TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
    GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模块名称,全路径
    也就是当前运行程序的全路径
    利用方法一的解析路径的方法,即可得到程序所在路径。

    GetModuleFileName函数原型
    DWORD GetModuleFileName(
       HMODULE hModule,     // handle to module。将要得到的模块的句柄。如果是当前模块,NULL
       LPTSTR lpFilename,   // path buffer   得到的文件名。
       DWORD nSize)          // size of buffer   一般MAX_PATH就可以了

  • 相关阅读:
    ActiveSync合作关系对话框的配置
    WINCE对象存储区(object store)
    Wince 隐藏TASKBAR的方法
    Wince输入法换肤换语言机制
    poj 3080 Blue Jeans 解题报告
    codeforces A. Vasily the Bear and Triangle 解题报告
    hdu 1050 Moving Tables 解题报告
    hdu 1113 Word Amalgamation 解题报告
    codeforces A. IQ Test 解题报告
    poj 1007 DNA Sorting 解题报告
  • 原文地址:https://www.cnblogs.com/dengpeng1004/p/4528354.html
Copyright © 2011-2022 走看看