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