直接刪所有\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;
}