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;  
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章