C reads the instance details of the ini file

  • 2020-06-01 10:26:01
  • OfStack

C reads ini files

Preface:

With Windows, you can easily read the contents of the.ini configuration file using GetPrivateProfileString or GetPrivateProfileInt, but on the Linux platform, this is not the case. To solve this problem, we are going to use C to read ini, which is no longer restricted by the platform.


#define CONF_FILE_PATH "Config.ini"
#include <string.h>
#ifdef WIN32
#include <Windows.h>
#include <stdio.h>
#else
#define MAX_PATH 260
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#endif
char g_szConfigPath[MAX_PATH];
// Gets the current program directory 
int GetCurrentPath(char buf[],char *pFileName)
{
#ifdef WIN32
GetModuleFileName(NULL,buf,MAX_PATH);
#else
char pidfile[64];
int bytes;
int fd;
sprintf(pidfile, "/proc/%d/cmdline", getpid());
fd = open(pidfile, O_RDONLY, 0);
bytes = read(fd, buf, 256);
close(fd);
buf[MAX_PATH] = '\0';
#endif
char * p = &buf[strlen(buf)];
do
{
*p = '\0';
p--;
#ifdef WIN32
} while('\\' != *p );
#else
} while('/' != *p );
#endif
p++;
// Profile directory 
memcpy(p,pFileName,strlen(pFileName));
return 0;
}
// from INI The file reads string-type data 
char *GetIniKeyString(char *title,char *key,char *filename)
{
FILE *fp;
char szLine[1024];
static char tmpstr[1024];
int rtnval;
int i = 0;
int flag = 0;
char *tmp;
if((fp = fopen(filename,"r")) == NULL)
{
printf("have no such file \n");
return "";
}
while(!feof(fp))
{
rtnval = fgetc(fp);
if(rtnval == EOF)
{
break;
}
else
{
szLine[i++] = rtnval;
}
if(rtnval == '\n')
{
#ifndef WIN32
i--;
#endif
szLine[--i] = '\0';
i = 0;
tmp = strchr(szLine, '=');
if(( tmp != NULL )&&(flag == 1))
{
if(strstr(szLine,key)!=NULL)
{
// Comment lines 
if ('#' == szLine[0])
{
}
else if ( '\/' == szLine[0] && '\/' == szLine[1] )
{
}
else
{
// Looking for a dozen key Corresponding variables 
strcpy(tmpstr,tmp+1);
fclose(fp);
return tmpstr;
}
}
}
else
{
strcpy(tmpstr,"[");
strcat(tmpstr,title);
strcat(tmpstr,"]");
if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )
{
// find title
flag = 1;
}
}
}
}
fclose(fp);
return "";
}
// from INI The file reads the whole type of data 
int GetIniKeyInt(char *title,char *key,char *filename)
{
return atoi(GetIniKeyString(title,key,filename));
}
int main(int argc,char* argv[])
{
char buf[MAX_PATH];
memset(buf,0,sizeof(buf));
GetCurrentPath(buf,CONF_FILE_PATH);
strcpy(g_szConfigPath,buf);
int iCatAge;
char szCatName[32];
iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);
strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));
return 0;
}

#define CONF_FILE_PATH "Config.ini" 
 
#include <string.h> 
 
#ifdef WIN32 
#include <Windows.h> 
#include <stdio.h> 
#else 
 
#define MAX_PATH 260 
 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdarg.h> 
#endif 
 
char g_szConfigPath[MAX_PATH]; 
 
// Gets the current program directory  
int GetCurrentPath(char buf[],char *pFileName) 
{ 
#ifdef WIN32 
  GetModuleFileName(NULL,buf,MAX_PATH);  
#else 
  char pidfile[64]; 
  int bytes; 
  int fd; 
 
  sprintf(pidfile, "/proc/%d/cmdline", getpid()); 
 
  fd = open(pidfile, O_RDONLY, 0); 
  bytes = read(fd, buf, 256); 
  close(fd); 
  buf[MAX_PATH] = '\0'; 
 
#endif 
  char * p = &buf[strlen(buf)]; 
  do  
  { 
    *p = '\0'; 
    p--; 
#ifdef WIN32 
  } while( '\\' != *p ); 
#else 
  } while( '/' != *p ); 
#endif 
 
  p++; 
 
  // Profile directory  
  memcpy(p,pFileName,strlen(pFileName)); 
  return 0; 
} 
 
// from INI The file reads string-type data  
char *GetIniKeyString(char *title,char *key,char *filename)  
{  
  FILE *fp;  
  char szLine[1024]; 
  static char tmpstr[1024]; 
  int rtnval; 
  int i = 0;  
  int flag = 0;  
  char *tmp; 
 
  if((fp = fopen(filename, "r")) == NULL)  
  {  
    printf("have  no  such  file \n"); 
    return "";  
  } 
  while(!feof(fp))  
  {  
    rtnval = fgetc(fp);  
    if(rtnval == EOF)  
    {  
      break;  
    }  
    else  
    {  
      szLine[i++] = rtnval;  
    }  
    if(rtnval == '\n')  
    {  
#ifndef WIN32 
      i--; 
#endif  
      szLine[--i] = '\0'; 
      i = 0;  
      tmp = strchr(szLine, '=');  
 
      if(( tmp != NULL )&&(flag == 1))  
      {  
        if(strstr(szLine,key)!=NULL)  
        {  
          // Comment lines  
          if ('#' == szLine[0]) 
          { 
          } 
          else if ( '\/' == szLine[0] && '\/' == szLine[1] ) 
          { 
             
          } 
          else 
          { 
            // Looking for a dozen key Corresponding variables  
            strcpy(tmpstr,tmp+1);  
            fclose(fp); 
            return tmpstr;  
          } 
        }  
      } 
      else  
      {  
        strcpy(tmpstr,"[");  
        strcat(tmpstr,title);  
        strcat(tmpstr,"]"); 
        if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 )  
        { 
          // find title 
          flag = 1;  
        } 
      } 
    } 
  } 
  fclose(fp);  
  return "";  
} 
 
// from INI The file reads the whole type of data  
int GetIniKeyInt(char *title,char *key,char *filename) 
{ 
  return atoi(GetIniKeyString(title,key,filename)); 
} 
 
int main(int argc, char* argv[]) 
{ 
  char buf[MAX_PATH]; 
  memset(buf,0,sizeof(buf)); 
  GetCurrentPath(buf,CONF_FILE_PATH); 
  strcpy(g_szConfigPath,buf); 
 
  int iCatAge; 
  char szCatName[32]; 
   
  iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath); 
  strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath)); 
 
  return 0; 
} 

Here are the configuration files:


[CAT]
age=2
name=Tom

If you have any questions, please leave a message or come to the site community to exchange discussion, thank you for reading, hope to help you, thank you for your support of the site!


Related articles: