* 函數(shù)名: GetIniKeyString
* 入口參數(shù): title
* 配置文件中一組數(shù)據(jù)的標(biāo)識
* key
* 這組數(shù)據(jù)中要讀出的值的標(biāo)識
* filename
* 要讀取的文件路徑
* 返回值: 找到需要查的值則返回正確結(jié)果 0
* 否則返回-1
*/
int GetIniKeyString(const char* title, const char* key, const char* filename, char* buf)
{
FILE* fp;
int flag = 0;
char sTitle[64], * wTmp;
char sLine[1024];
//將title 賦值給sTitle
sprintf(sTitle, "[%s]", title);
if (NULL == ( fp = fopen(filename, "r") )) {
perror("fopen");
return -1;
}
while (NULL != fgets(sLine, 1024, fp)) {
// 這是注釋行
if (0 == strncmp("http://", sLine, 2))
continue;
if ('#' == sLine[0])
continue;
wTmp = strchr(sLine, '='); //找到配置文件首次出出現(xiàn)等號的位置 未找到返回NULL
if ((NULL != wTmp) && (1 == flag)) {
if (0 == strncmp(key, sLine, strlen(key))) { // 長度依文件讀取的為準(zhǔn)
sLine[strlen(sLine) - 1] = '\0';
fclose(fp);
while (*(wTmp + 1) == ' ') { //跳過空格
wTmp++;
}
strcpy(buf, wTmp + 1); //賦值
return 0;
}
}
else {
if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 長度依文件讀取的為準(zhǔn)
flag = 1; // 找到標(biāo)題位置
}
}
}
fclose(fp);
return -1;
}
一些所用到的C庫函數(shù)
strncmp()
int strncmp(const char *str1, const char *str2, size_t n)
把 str1 和 str2 進(jìn)行比較,最多比較前 n 個(gè)字節(jié)耻煤。
該函數(shù)返回值如下:
- 如果返回值 < 0,則表示 str1 小于 str2。
- 如果返回值 > 0牙捉,則表示 str2 小于 str1肴敛。
- 如果返回值 = 0术裸,則表示 str1 等于 str2。
fgets()
char *fgets(char *str, int n, FILE *stream)
從指定的流 stream 讀取一行黄虱,并把它存儲在 str 所指向的字符串內(nèi)。當(dāng)讀取 (n-1) 個(gè)字符時(shí)庸诱,或者讀取到換行符時(shí)捻浦,或者到達(dá)文件末尾時(shí),它會停止桥爽,具體視情況而定朱灿。
perror()
C 庫函數(shù) void perror(const char *str)
把一個(gè)描述性錯誤消息輸出到標(biāo)準(zhǔn)錯誤 stderr。首先輸出字符串 str聚谁,后跟一個(gè)冒號母剥,然后是一個(gè)空格。
strchr()
char *strchr(const char *str, int c)
在參數(shù) str 所指向的字符串中搜索第一次出現(xiàn)字符 c(一個(gè)無符號字符)的位置。
該函數(shù)返回在字符串 str 中第一次出現(xiàn)字符 c 的位置环疼,如果未找到該字符則返回 NULL.
strlen()
Strlen所作的是一個(gè)計(jì)數(shù)器的工作习霹,它從內(nèi)存的某個(gè)位置(可以是字符串開頭,中間某個(gè)位置炫隶,甚至是某個(gè)不確定的內(nèi)存區(qū)域)開始掃描淋叶,直到碰到第一個(gè)字符串結(jié)束符'\0'為止,然后返回計(jì)數(shù)器值(長度不包含'\0')伪阶。
頭文件:string.h或cstring
格式: strlen (字符指針表達(dá)式)
功能:計(jì)算給定字符串的(unsigned int型)長度煞檩,不包括'\0'在內(nèi)
說明:返回s的長度,不包括結(jié)束符NULL栅贴。