C语言读取ini文件 windows DOS(\r\n 0x0D 0X0A)或Linux (\n 0x0A) 两种格式都可以

 直接删所有\r  即0x0A就一样了。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define PRN_ERRMSG_RETURN printf
#define  MAX_PATH 260
//功能:从字符串中str删除所有某字符target
void delete_char(char str[],char target)
{
  int i,j;
  for(i=j=0;str[i]!='\0';i++)
  {
    if(str[i]!=target)
    {
      str[j++]=str[i];
    }
 }
 str[j]='\0';
}
/* 
 * 函数名:         GetIniKeyString 
 * 入口参数:        title 
 *                      配置文件中一组数据的标识 
 *                  key 
 *                      这组数据中要读出的值的标识 
 *                  filename 
 *                      要读取的文件路径 
 * 返回值:         找到需要查的值则返回正确结果 
 *                  否则返回NULL 
 */  
char *GetIniKeyString(char *title,char *key,char *filename)  
{  
    FILE *fp;  
    int  flag = 0;  
    char sTitle[64], *wTmp;  
    char sLine[1024]  ;  
  
    sprintf(sTitle, "[%s]", title);  
    if(NULL == (fp = fopen(filename, "r"))) {  
        perror("fopen");  
        return NULL;  
    }  
    printf("%s %s %s=",filename,sTitle,key);
    while (NULL != fgets(sLine, 1024, fp)) {  //从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止       
        delete_char(sLine,'\r'); //windows DOS(\r\n 0x0D 0X0A)或Linux (\n 0x0A)
        // 这是注释行  
        if (0 == strncmp("//", sLine, 2)) continue;  //把 str1 和 str2 进行比较,最多比较前 n 个字节。
        if ('#' == sLine[0])              continue;  
  
        wTmp = strchr(sLine, '=');  //可以查找字符串s中首次出现字符=的位置。
        if ((NULL != wTmp) && (1 == flag)) {  
            if (0 == strncmp(key, sLine, wTmp-sLine)) { // 长度依文件读取的为准  
                sLine[strlen(sLine) -1] = '\0';  
                fclose(fp);  
                printf("%s\n",wTmp + 1);
                return wTmp + 1;  
            }  
        } else {  
            if (strlen(sLine)>1 && 0 == strncmp(sTitle, sLine, strlen(sLine) - 1)) { // 长度依文件读取的为准 
             // printf("\nsTitle:%sH sLine:%sH,sLineLen:%ld\n",sTitle,sLine,strlen(sLine) - 1);
                flag = 1; // 找到标题位置  
            }  
        }  
    }  
    fclose(fp); 
    printf("No exist\n"); //不存在
    return "No exist";  
}  
  
/* 
 * 函数名:         GetIniKeyInt 
 * 入口参数:        title 
 *                      配置文件中一组数据的标识 
 *                  key 
 *                      这组数据中要读出的值的标识 
 *                  filename 
 *                      要读取的文件路径 
 * 返回值:         找到需要查的值则返回正确结果 
 *                  否则返回NULL 
 */  
int GetIniKeyInt(char *title,char *key,char *filename)  
{  
    return atoi(GetIniKeyString(title, key, filename));  
}  
   
int main(int argc,char *argv[])  
{  
    GetIniKeyString("info", "sn", "uart.ini");
    GetIniKeyInt("ac380", "address", "uart.ini"); 
    return 0;  
}
发布了331 篇原创文章 · 获赞 140 · 访问量 71万+

猜你喜欢

转载自blog.csdn.net/chenhao0568/article/details/101284097
今日推荐