?? inifileop.c
字號(hào):
if((fp = fopen((char *)CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;
while(1) /* 搜找項(xiàng)section */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf1, MAX_CFG_BUF);
if(n < -1) goto r_cfg_end;
ret = CFG_SECTION_NOT_FOUND;
if(n < 0) goto r_cfg_end; /* 文件尾,未發(fā)現(xiàn) */
line_no++;
n = strlen(strtriml(strtrimr(buf1)));
if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行 或 注釋行 */
ret = CFG_ERR_FILE_FORMAT;
if(n > 2 && ((buf1[0] == CFG_ssl && buf1[n-1] != CFG_ssr)))
goto r_cfg_end;
if(buf1[0] == CFG_ssl)
{
buf1[n-1] = 0x00;
if(strcmp(buf1+1, section) == 0)
break; /* 找到項(xiàng)section */
}
}
CFG_section_line_no = line_no;
while(1) /* 搜找key */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf1, MAX_CFG_BUF);
if(n < -1) goto r_cfg_end;
ret = CFG_KEY_NOT_FOUND;
if(n < 0) goto r_cfg_end; /* 文件尾,未發(fā)現(xiàn)key */
line_no++;
CFG_key_line_no = line_no;
CFG_key_lines = 1;
n = strlen(strtriml(strtrimr(buf1)));
if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行 或 注釋行 */
ret = CFG_KEY_NOT_FOUND;
if(buf1[0] == CFG_ssl) goto r_cfg_end;
if(buf1[n-1] == '+') /* 遇+號(hào)表示下一行繼續(xù) */
{
buf1[n-1] = 0x00;
while(1)
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf2, MAX_CFG_BUF);
if(n < -1) goto r_cfg_end;
if(n < 0) break; /* 文件結(jié)束 */
line_no++;
CFG_key_lines++;
n = strlen(strtrimr(buf2));
ret = CFG_ERR_EXCEED_BUF_SIZE;
if(n > 0 && buf2[n-1] == '+') /* 遇+號(hào)表示下一行繼續(xù) */
{
buf2[n-1] = 0x00;
if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)
goto r_cfg_end;
strcat(buf1, buf2);
continue;
}
if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)
goto r_cfg_end;
strcat(buf1, buf2);
break;
}
}
ret = CFG_ERR_FILE_FORMAT;
if(SplitKeyValue(buf1, &key_ptr, &val_ptr) != 1)
goto r_cfg_end;
strtriml(strtrimr(key_ptr));
if(strcmp(key_ptr, key) != 0)
continue; /* 和key值不匹配 */
strcpy(buf, val_ptr);
break;
}
ret = CFG_OK;
r_cfg_end:
if(fp != NULL) fclose(fp);
return ret;
}
/**********************************************************************
* 函數(shù)名稱: ConfigSetKey
* 功能描述: 設(shè)置key的值
* 訪問的表: 無
* 修改的表: 無
* 輸入?yún)?shù): void *CFG_file 文件;void *section 項(xiàng)值;
* void *key 鍵值;void *buf key的值
* 輸出參數(shù): 無
* 返 回 值: 0 --- ok 非0 --- error
* 其它說明: 無
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
* -----------------------------------------------
* 2005/6/23 V1.0 廖月旺 創(chuàng)建
*
***********************************************************************/
int ConfigSetKey(void *CFG_file, void *section, void *key, void *buf)
{
FILE *fp1, *fp2;
char buf1[MAX_CFG_BUF + 1];
int line_no, line_no1, n, ret, ret2;
char *tmpfname;
ret = ConfigGetKey(CFG_file, section, key, buf1);
if(ret <= CFG_ERR && ret != CFG_ERR_OPEN_FILE) return ret;
if(ret == CFG_ERR_OPEN_FILE || ret == CFG_SECTION_NOT_FOUND)
{
if((fp1 = fopen((char *)CFG_file, "a")) == NULL)
return CFG_ERR_CREATE_FILE;
if(fprintf(fp1, "%c%s%c\n", CFG_ssl, section, CFG_ssr) == EOF)
{
fclose(fp1);
return CFG_ERR_WRITE_FILE;
}
if(fprintf(fp1, "%s=%s\n", key, buf) == EOF)
{
fclose(fp1);
return CFG_ERR_WRITE_FILE;
}
fclose(fp1);
return CFG_OK;
}
if((tmpfname = tmpnam(NULL)) == NULL)
return CFG_ERR_CREATE_FILE;
if((fp2 = fopen(tmpfname, "w")) == NULL)
return CFG_ERR_CREATE_FILE;
ret2 = CFG_ERR_OPEN_FILE;
if((fp1 = fopen((char *)CFG_file, "rb")) == NULL) goto w_cfg_end;
if(ret == CFG_KEY_NOT_FOUND)
line_no1 = CFG_section_line_no;
else /* ret = CFG_OK */
line_no1 = CFG_key_line_no - 1;
for(line_no = 0; line_no < line_no1; line_no++)
{
ret2 = CFG_ERR_READ_FILE;
n = FileGetLine(fp1, buf1, MAX_CFG_BUF);
if(n < 0) goto w_cfg_end;
ret2 = CFG_ERR_WRITE_FILE;
if(fprintf(fp2, "%s\n", buf1) == EOF) goto w_cfg_end;
}
if(ret != CFG_KEY_NOT_FOUND)
for( ; line_no < line_no1+CFG_key_lines; line_no++)
{
ret2 = CFG_ERR_READ_FILE;
n = FileGetLine(fp1, buf1, MAX_CFG_BUF);
if(n < 0) goto w_cfg_end;
}
ret2 = CFG_ERR_WRITE_FILE;
if(fprintf(fp2, "%s=%s\n", key, buf) == EOF) goto w_cfg_end;
while(1)
{
ret2 = CFG_ERR_READ_FILE;
n = FileGetLine(fp1, buf1, MAX_CFG_BUF);
if(n < -1) goto w_cfg_end;
if(n < 0) break;
ret2 = CFG_ERR_WRITE_FILE;
if(fprintf(fp2, "%s\n", buf1) == EOF) goto w_cfg_end;
}
ret2 = CFG_OK;
w_cfg_end:
if(fp1 != NULL) fclose(fp1);
if(fp2 != NULL) fclose(fp2);
if(ret2 == CFG_OK)
{
ret = FileCopy(tmpfname, CFG_file);
if(ret != 0) return CFG_ERR_CREATE_FILE;
}
remove(tmpfname);
return ret2;
}
/**********************************************************************
* 函數(shù)名稱: ConfigGetSections
* 功能描述: 獲得所有section
* 訪問的表: 無
* 修改的表: 無
* 輸入?yún)?shù): void *CFG_file 文件
* 輸出參數(shù): char *sections[] 存放section名字
* 返 回 值: 返回section個(gè)數(shù)。若出錯(cuò),返回負(fù)數(shù)。
* 其它說明: 無
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
* -----------------------------------------------
* 2005/6/23 V1.0 廖月旺 創(chuàng)建
*
***********************************************************************/
int ConfigGetSections(void *CFG_file, char *sections[])
{
FILE *fp;
char buf1[MAX_CFG_BUF + 1];
int n, n_sections = 0, ret;
if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;
while(1) /*搜找項(xiàng)section */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf1, MAX_CFG_BUF);
if(n < -1) goto cfg_scts_end;
if(n < 0) break; /* 文件尾 */
n = strlen(strtriml(strtrimr(buf1)));
if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行 或 注釋行 */
ret = CFG_ERR_FILE_FORMAT;
if(n > 2 && ((buf1[0] == CFG_ssl && buf1[n-1] != CFG_ssr)))
goto cfg_scts_end;
if(buf1[0] == CFG_ssl)
{
buf1[n-1] = 0x00;
strcpy(sections[n_sections], buf1+1);
n_sections++;
}
}
ret = n_sections;
cfg_scts_end:
if(fp != NULL) fclose(fp);
return ret;
}
/**********************************************************************
* 函數(shù)名稱: ConfigGetKeys
* 功能描述: 獲得所有key的名字(key=value形式, value可用加號(hào)表示續(xù)行)
* 訪問的表: 無
* 修改的表: 無
* 輸入?yún)?shù): void *CFG_file 文件 void *section 項(xiàng)值
* 輸出參數(shù): char *keys[] 存放key名字
* 返 回 值: 返回key個(gè)數(shù)。若出錯(cuò),返回負(fù)數(shù)。
* 其它說明: 無
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
* -----------------------------------------------
* 2005/6/23 V1.0 廖月旺 創(chuàng)建
*
***********************************************************************/
int ConfigGetKeys(void *CFG_file, void *section, char *keys[])
{
FILE *fp;
char buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];
char *key_ptr, *val_ptr;
int n, n_keys = 0, ret;
if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;
while(1) /* 搜找項(xiàng)section */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf1, MAX_CFG_BUF);
if(n < -1) goto cfg_keys_end;
ret = CFG_SECTION_NOT_FOUND;
if(n < 0) goto cfg_keys_end; /* 文件尾 */
n = strlen(strtriml(strtrimr(buf1)));
if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行 或 注釋行 */
ret = CFG_ERR_FILE_FORMAT;
if(n > 2 && ((buf1[0] == CFG_ssl && buf1[n-1] != CFG_ssr)))
goto cfg_keys_end;
if(buf1[0] == CFG_ssl)
{
buf1[n-1] = 0x00;
if(strcmp(buf1+1, section) == 0)
break; /* 找到項(xiàng)section */
}
}
while(1)
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf1, MAX_CFG_BUF);
if(n < -1) goto cfg_keys_end;
if(n < 0) break; /* 文件尾 */
n = strlen(strtriml(strtrimr(buf1)));
if(n == 0 || buf1[0] == CFG_nts) continue; /* 空行 或 注釋行 */
ret = CFG_KEY_NOT_FOUND;
if(buf1[0] == CFG_ssl)
break; /* 另一個(gè) section */
if(buf1[n-1] == '+') /* 遇+號(hào)表示下一行繼續(xù) */
{
buf1[n-1] = 0x00;
while(1)
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fp, buf2, MAX_CFG_BUF);
if(n < -1) goto cfg_keys_end;
if(n < 0) break; /* 文件尾 */
n = strlen(strtrimr(buf2));
ret = CFG_ERR_EXCEED_BUF_SIZE;
if(n > 0 && buf2[n-1] == '+') /* 遇+號(hào)表示下一行繼續(xù) */
{
buf2[n-1] = 0x00;
if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)
goto cfg_keys_end;
strcat(buf1, buf2);
continue;
}
if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF)
goto cfg_keys_end;
strcat(buf1, buf2);
break;
}
}
ret = CFG_ERR_FILE_FORMAT;
if(SplitKeyValue(buf1, &key_ptr, &val_ptr) != 1)
goto cfg_keys_end;
strtriml(strtrimr(key_ptr));
strcpy(keys[n_keys], key_ptr);
n_keys++;
}
ret = n_keys;
cfg_keys_end:
if(fp != NULL) fclose(fp);
return ret;
}
/**********************************************************************
* 函數(shù)名稱: INIFileTstmain
* 功能描述: 測(cè)試函數(shù)入口
* 訪問的表: 無
* 修改的表: 無
* 輸入?yún)?shù): 無
* 輸出參數(shù): 無
* 返 回 值: 無
* 其它說明: 無
* 修改日期 版本號(hào) 修改人 修改內(nèi)容
* -----------------------------------------------
* 2005/6/23 V1.0 廖月旺 創(chuàng)建
*
***********************************************************************/
void INIFileTstmain(void)
{
char buf[20]="";
char buf1[20]="";
char buf2[20]="";
char buf3[20]="";
int ret;
long abc;
int i;
char * section;
char * key;
char * val;
char * name;
char * index;
section = buf1;
key = buf2;
val = buf3;
ret = ConfigSetKey("Config.dat", "Jack:Lio", "Jack", "-12321");
for(i = 0;i < 20; i++)
{
memset(buf,0x00,20);
memset(buf1,0x00,20);
memset(buf2,0x00,20);
memset(buf3,0x00,20);
sprintf(buf,"%d",i);
sprintf(buf2,"Lio%d",i);
sprintf(buf3,"%d",i);
JoinNameIndexToSection(§ion, "Jack", buf);
ConfigSetKey("Config.dat", section, key, val);
}
name = buf2;
index = buf3;
memset(buf1,0x00,20);
memset(buf2,0x00,20);
memset(buf3,0x00,20);
strcpy(buf1,"Jack:Lio");
SplitSectionToNameIndex(section, &name, &index);
printf("\n name=%s,index=%s\n",name,index);
ret = ConfigGetKey("Config.dat", "Jack:Lio", "Jack", buf);
if (strcmp(buf,"")!=0) {
abc = atol(buf);
}
printf("\n buf=%s\n",buf);
printf("\n abc=%ld\n",abc);
ConfigSetKey("Config.dat","Jack:Lio", "Email", "liaoyuewang@163.com");
FileCopy("Config.dat", "Configbak.dat");
printf("\nFile %s line%d\n",__FILE__,__LINE__);
printf("\n******** This test is created by Jack Lio. Email:liaoyuewang@163.com********\n\n");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -