怎样用读取ini文件,怎么和VB中不一样了?

时间:2022-01-29 04:27:09
我需要读取一个ini文件,使用GetPrivateProfileString(),但总是返回为空,同样的方法在VB中就可以,不知道错在那里?
Thanks

8 个解决方案

#1


给你一个头文件

#include "stdafx.h"
#include "windows.h"

#define FunOk    0
#define FunFail -1
// ini文件操作类
class CIniFiles{
private:
CString sFileName;
public:
CIniFiles( CString I_FileName );
~CIniFiles();
void ReadString( CString I_SectionName,
             CString I_KeyName,
 CString *O_KeyValue );
void ReadInteger( CString I_SectionName,
              CString I_KeyName,
  int     &O_KeyValue );
int WriteString( CString I_SectionName,
                 CString I_KeyName,
              CString I_KeyValue );
int WriteInteger( CString I_SectionName,
              CString I_KeyName,
      int     I_KeyValue );
};

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline CIniFiles::CIniFiles( CString I_FileName )
// ini文件类构造函数
{
sFileName = I_FileName;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline void CIniFiles::ReadString( CString I_SectionName,
   CString I_KeyName,
   CString *O_KeyValue )
// ini文件类读块中某关键字的值的函数(字符串型)
{
char *result = new char[300];
int Totalsize = 300;
GetPrivateProfileString( I_SectionName,
                             I_KeyName,
                             *O_KeyValue,
 result,
 Totalsize,
 sFileName);
*O_KeyValue = result;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline void CIniFiles::ReadInteger( CString I_SectionName,
   CString I_KeyName,
   int     &O_KeyValue )
// ini文件类读块中某关键字的值的函数(整型)
{
char *result = new char[300];
int Totalsize = 300;
GetPrivateProfileString( I_SectionName,
                             I_KeyName,
                             "",
 result,
 Totalsize,
 sFileName);
if ( result != "") 
   O_KeyValue = atoi(result);    
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline int CIniFiles::WriteString( CString I_SectionName,
   CString I_KeyName,
   CString I_KeyValue )
// ini文件类写块中某关键字的值的函数(字符串型)
{
if ( WritePrivateProfileString( I_SectionName,
                            I_KeyName,
    I_KeyValue,
    sFileName ) != 0 ) 
return FunOk;
else
return FunFail;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline int CIniFiles::WriteInteger( CString I_SectionName,
    CString I_KeyName,
    int     I_KeyValue )
// ini文件类写块中某关键字的值的函数(整型)
{
char tempkey[24];
CString temps;
_itoa( I_KeyValue,tempkey,10);
temps = tempkey;
if ( WritePrivateProfileString( I_SectionName,
                            I_KeyName,
    temps,
    sFileName ) != 0 ) 
return FunOk;
else
return FunFail;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline CIniFiles::~CIniFiles()
// ini文件类析构函数
{
sFileName = "";
}

#2



CWinApp有四个成员函数用来读写INI文件:
GetProfileString,WriteProfileString,
GetProfileInt,WriteProfileInt
以下是在MSDN找到的范例:

   CString strSection       = "My Section";
   CString strStringItem    = "My String Item";
   CString strIntItem       = "My Int Item";

   CWinApp* pApp = AfxGetApp();

   pApp->WriteProfileString(strSection, strStringItem, "test");

   CString strValue;
   strValue = pApp->GetProfileString(strSection, strStringItem);
   ASSERT(strValue == "test");

   pApp->WriteProfileInt(strSection, strIntItem, 1234);
   int nValue;
   nValue = pApp->GetProfileInt(strSection, strIntItem, 0);
   ASSERT(nValue == 1234); 
 

#3


你在MSDN的索引中输入:
LoadPrivateProfile……能找到读INI文件的函数,如LoadPrivateProfileSection等等。
WritePrivateProfil……能找到写INI文件的函数,如WritePrivateProfileString等等。
这些都是些API函数,还有就是dzl所述CWinApp的成员函数也很好用。不过有可能会被写到注册表中。
其实微软更推荐把程序的设置放到注册表中。怎么办,看你自己的需要吧。

#4


我是想读取ini文件,而不是读取注册表中的文件,我使用了hellsun的程序,但发现什么也没有取出来,请问为什么?

#5


我把hellsun的程序改了改,調試通過了!

//iniFiles.h
#ifndef __INIFILES_H_DKLFJ894TKJGFDS8U43JGJWERGJ__
#define __INIFILES_H_DKLFJ894TKJGFDS8U43JGJWERGJ__

#define FunOk    0
#define FunFail -1
// ini文件操作?
class CIniFiles
{
private:
  CString sFileName;
public:
  CIniFiles( LPCTSTR I_FileName);
  ~CIniFiles();
  void ReadString( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    CString& O_KeyValue );
  void ReadInteger( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    int    &O_KeyValue );
  int WriteString( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    LPCTSTR I_KeyValue );
  int WriteInteger( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    int    I_KeyValue );
};

#endif //__INIFILES_H_DKLFJ894TKJGFDS8U43JGJWERGJ__

//iniFiles.cpp
#include "stdafx.h"
#include "iniFiles.h"

CIniFiles::CIniFiles( LPCTSTR I_FileName)
// ini文件?构造函?
{
  sFileName = I_FileName;
  if (sFileName.Find('\\') < 0)
  {
    char sOldDir[MAX_PATH];
    GetCurrentDirectory(MAX_PATH, sOldDir);
    sFileName = sOldDir;
    sFileName += "\\";
    sFileName += I_FileName;
  }
}

void CIniFiles::ReadString( LPCTSTR I_SectionName,
                  LPCTSTR I_KeyName,
                  CString& O_KeyValue )
                  // ini文件???中某??字的值的函?(字符串型)
{
  char *result = new char[300];
  int Totalsize = 300;
  GetPrivateProfileString( I_SectionName,
    I_KeyName,
    O_KeyValue,
    result,
    Totalsize,
    sFileName);
  O_KeyValue = result;
  delete[] result;
}

void CIniFiles::ReadInteger( LPCTSTR I_SectionName,
                   LPCTSTR I_KeyName,
                   int    &O_KeyValue )
                   // ini文件???中某??字的值的函?(整型)
{
  char *result = new char[300];
  int Totalsize = 300;
  GetPrivateProfileString( I_SectionName,
    I_KeyName,
    "",
    result,
    Totalsize,
    sFileName);
  if ( result != "")
    O_KeyValue = atoi(result);
  delete[] result;
}

int CIniFiles::WriteString( LPCTSTR I_SectionName,
                  LPCTSTR I_KeyName,
                  LPCTSTR I_KeyValue )
                  // ini文件???中某??字的值的函?(字符串型)
{
  if ( WritePrivateProfileString( I_SectionName,
    I_KeyName,
    I_KeyValue,
    sFileName ) != 0 )
    return FunOk;
  else
    return FunFail;
}

int CIniFiles::WriteInteger( LPCTSTR I_SectionName,
                   LPCTSTR I_KeyName,
                   int    I_KeyValue )
                   // ini文件???中某??字的值的函?(整型)
{
  char tempkey[24];
  CString temps;
  _itoa( I_KeyValue,tempkey,10);
  temps = tempkey;
  if ( WritePrivateProfileString( I_SectionName,
    I_KeyName,
    temps,
    sFileName ) != 0 )
    return FunOk;
  else
    return FunFail;
}

CIniFiles::~CIniFiles()
// ini文件?析构函?
{
  sFileName = "";
}

#6


必须先用构造函数指定要打开的文件(含全路径)

CIniFiles Ini("4.rul");
int tt;
Ini.ReadInteger("Public","DataNum",tt);
return;

大小写敏感

#7


注意,你读取时是否分配了内存区。
可以用以下例子试试:
char s[255];
GetPrivateProfileString("AppName","KeyName","",s,255,"文件路径名"

#8


分数虽然少了一些,但代表我对各位的感谢

#1


给你一个头文件

#include "stdafx.h"
#include "windows.h"

#define FunOk    0
#define FunFail -1
// ini文件操作类
class CIniFiles{
private:
CString sFileName;
public:
CIniFiles( CString I_FileName );
~CIniFiles();
void ReadString( CString I_SectionName,
             CString I_KeyName,
 CString *O_KeyValue );
void ReadInteger( CString I_SectionName,
              CString I_KeyName,
  int     &O_KeyValue );
int WriteString( CString I_SectionName,
                 CString I_KeyName,
              CString I_KeyValue );
int WriteInteger( CString I_SectionName,
              CString I_KeyName,
      int     I_KeyValue );
};

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline CIniFiles::CIniFiles( CString I_FileName )
// ini文件类构造函数
{
sFileName = I_FileName;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline void CIniFiles::ReadString( CString I_SectionName,
   CString I_KeyName,
   CString *O_KeyValue )
// ini文件类读块中某关键字的值的函数(字符串型)
{
char *result = new char[300];
int Totalsize = 300;
GetPrivateProfileString( I_SectionName,
                             I_KeyName,
                             *O_KeyValue,
 result,
 Totalsize,
 sFileName);
*O_KeyValue = result;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline void CIniFiles::ReadInteger( CString I_SectionName,
   CString I_KeyName,
   int     &O_KeyValue )
// ini文件类读块中某关键字的值的函数(整型)
{
char *result = new char[300];
int Totalsize = 300;
GetPrivateProfileString( I_SectionName,
                             I_KeyName,
                             "",
 result,
 Totalsize,
 sFileName);
if ( result != "") 
   O_KeyValue = atoi(result);    
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline int CIniFiles::WriteString( CString I_SectionName,
   CString I_KeyName,
   CString I_KeyValue )
// ini文件类写块中某关键字的值的函数(字符串型)
{
if ( WritePrivateProfileString( I_SectionName,
                            I_KeyName,
    I_KeyValue,
    sFileName ) != 0 ) 
return FunOk;
else
return FunFail;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline int CIniFiles::WriteInteger( CString I_SectionName,
    CString I_KeyName,
    int     I_KeyValue )
// ini文件类写块中某关键字的值的函数(整型)
{
char tempkey[24];
CString temps;
_itoa( I_KeyValue,tempkey,10);
temps = tempkey;
if ( WritePrivateProfileString( I_SectionName,
                            I_KeyName,
    temps,
    sFileName ) != 0 ) 
return FunOk;
else
return FunFail;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
inline CIniFiles::~CIniFiles()
// ini文件类析构函数
{
sFileName = "";
}

#2



CWinApp有四个成员函数用来读写INI文件:
GetProfileString,WriteProfileString,
GetProfileInt,WriteProfileInt
以下是在MSDN找到的范例:

   CString strSection       = "My Section";
   CString strStringItem    = "My String Item";
   CString strIntItem       = "My Int Item";

   CWinApp* pApp = AfxGetApp();

   pApp->WriteProfileString(strSection, strStringItem, "test");

   CString strValue;
   strValue = pApp->GetProfileString(strSection, strStringItem);
   ASSERT(strValue == "test");

   pApp->WriteProfileInt(strSection, strIntItem, 1234);
   int nValue;
   nValue = pApp->GetProfileInt(strSection, strIntItem, 0);
   ASSERT(nValue == 1234); 
 

#3


你在MSDN的索引中输入:
LoadPrivateProfile……能找到读INI文件的函数,如LoadPrivateProfileSection等等。
WritePrivateProfil……能找到写INI文件的函数,如WritePrivateProfileString等等。
这些都是些API函数,还有就是dzl所述CWinApp的成员函数也很好用。不过有可能会被写到注册表中。
其实微软更推荐把程序的设置放到注册表中。怎么办,看你自己的需要吧。

#4


我是想读取ini文件,而不是读取注册表中的文件,我使用了hellsun的程序,但发现什么也没有取出来,请问为什么?

#5


我把hellsun的程序改了改,調試通過了!

//iniFiles.h
#ifndef __INIFILES_H_DKLFJ894TKJGFDS8U43JGJWERGJ__
#define __INIFILES_H_DKLFJ894TKJGFDS8U43JGJWERGJ__

#define FunOk    0
#define FunFail -1
// ini文件操作?
class CIniFiles
{
private:
  CString sFileName;
public:
  CIniFiles( LPCTSTR I_FileName);
  ~CIniFiles();
  void ReadString( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    CString& O_KeyValue );
  void ReadInteger( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    int    &O_KeyValue );
  int WriteString( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    LPCTSTR I_KeyValue );
  int WriteInteger( LPCTSTR I_SectionName,
    LPCTSTR I_KeyName,
    int    I_KeyValue );
};

#endif //__INIFILES_H_DKLFJ894TKJGFDS8U43JGJWERGJ__

//iniFiles.cpp
#include "stdafx.h"
#include "iniFiles.h"

CIniFiles::CIniFiles( LPCTSTR I_FileName)
// ini文件?构造函?
{
  sFileName = I_FileName;
  if (sFileName.Find('\\') < 0)
  {
    char sOldDir[MAX_PATH];
    GetCurrentDirectory(MAX_PATH, sOldDir);
    sFileName = sOldDir;
    sFileName += "\\";
    sFileName += I_FileName;
  }
}

void CIniFiles::ReadString( LPCTSTR I_SectionName,
                  LPCTSTR I_KeyName,
                  CString& O_KeyValue )
                  // ini文件???中某??字的值的函?(字符串型)
{
  char *result = new char[300];
  int Totalsize = 300;
  GetPrivateProfileString( I_SectionName,
    I_KeyName,
    O_KeyValue,
    result,
    Totalsize,
    sFileName);
  O_KeyValue = result;
  delete[] result;
}

void CIniFiles::ReadInteger( LPCTSTR I_SectionName,
                   LPCTSTR I_KeyName,
                   int    &O_KeyValue )
                   // ini文件???中某??字的值的函?(整型)
{
  char *result = new char[300];
  int Totalsize = 300;
  GetPrivateProfileString( I_SectionName,
    I_KeyName,
    "",
    result,
    Totalsize,
    sFileName);
  if ( result != "")
    O_KeyValue = atoi(result);
  delete[] result;
}

int CIniFiles::WriteString( LPCTSTR I_SectionName,
                  LPCTSTR I_KeyName,
                  LPCTSTR I_KeyValue )
                  // ini文件???中某??字的值的函?(字符串型)
{
  if ( WritePrivateProfileString( I_SectionName,
    I_KeyName,
    I_KeyValue,
    sFileName ) != 0 )
    return FunOk;
  else
    return FunFail;
}

int CIniFiles::WriteInteger( LPCTSTR I_SectionName,
                   LPCTSTR I_KeyName,
                   int    I_KeyValue )
                   // ini文件???中某??字的值的函?(整型)
{
  char tempkey[24];
  CString temps;
  _itoa( I_KeyValue,tempkey,10);
  temps = tempkey;
  if ( WritePrivateProfileString( I_SectionName,
    I_KeyName,
    temps,
    sFileName ) != 0 )
    return FunOk;
  else
    return FunFail;
}

CIniFiles::~CIniFiles()
// ini文件?析构函?
{
  sFileName = "";
}

#6


必须先用构造函数指定要打开的文件(含全路径)

CIniFiles Ini("4.rul");
int tt;
Ini.ReadInteger("Public","DataNum",tt);
return;

大小写敏感

#7


注意,你读取时是否分配了内存区。
可以用以下例子试试:
char s[255];
GetPrivateProfileString("AppName","KeyName","",s,255,"文件路径名"

#8


分数虽然少了一些,但代表我对各位的感谢