?? hvini.c
字號:
/************************************************* Copyright (C), 2004, DHC File name: hvini.c Author: 韋昭 Version: V1.0 Date: 2004-8-27 Description: 大額支付ini文件處理程序 Others: Function List: (函數定義,實現在hvini.c文件中) 1. int hv_readIni(char *filename,char *section,char *item,char *value) 讀取ini文件中某一項的值,filename為文件名,section為節名,item為項名, value為讀取得到的值(最長255個字符). 成功返回0,失敗返回-1 2.int hv_writeIni(char *filename,char *section,char *item,char *value) 設置ini文件中某一項的值,filename為文件名,section為節名,item為項名, value為要設置的值 成功返回0,失敗返回-1 內部函數,只供內部調用 1. int fgetline(FILE *fp, char *buffer, int maxlen) 讀取文件中的一行寫入buffer中去,最大取maxlen個字節。 2. int getItem(FILE *fp,char *section,char *item,char *val) 獲取section下item的值,放入val中,返回值請看函數說明 3. int splitItem(char *str) 得到一個item的值,去掉前面的空格等。 4. int writeLine(char *filename,char *buf,int line_no) 在filename中的第line_no處修改或插入buf中的數據 line_no為0時,表示在文件最后插入。 line_no為正數時表示在原行修改; line_no為負數時表示在下一行插入。 History: 1. Date: 2004-8-27 Author: 韋昭 Modification: 建立*************************************************/#include "hvini.h"/*內部函數定義區*/int fgetline(FILE *fp, char *buffer, int maxlen);int getItem(FILE *fp,char *section,char *item,char *val);int splitItem(char *str);int writeLine(char *filename,char *buf,int line_no);/************************************************* Function: int hv_readIni(char *filename,char *section,char *item,char *value) Description: 讀取ini文件中某一項的值,filename為文件名,section為節名,item為項名, value為讀取得到的值(最長255個字符). Calls: getItem() Called By: Table Accessed: 無 Table Updated: 無 Input: 1 char *filename為文件名 2 char *section為節名 3 char *item為項名 Output: value值,就是item的內容 Return: 成功返回0,失敗返回-1 Others: *************************************************/int hv_readIni(char *filename,char *section,char *item,char *value){ FILE *fp; int p; if((fp = fopen(filename,"r"))==NULL) { printf("Cannot read file:%s\n",filename); return INI_OP_FAIL; } p = getItem(fp,section,item,value); fclose(fp); if(p>0) return INI_OP_SUCCEE; else return INI_OP_FAIL;}/************************************************* Function: int hv_writeIni(char *filename,char *section,char *item,char *value) Description: 設置ini文件中某一項的值,filename為文件名,section為節名,item為項名, value為要設置的值 Calls: 1 getItem(fp,section,item,val) 2 writeLine(filename,buf,n) Called By: Table Accessed: 無 Table Updated: 無 Input: 1 char *filename為文件名; 2 char *section為節名; 3 char *item為項名. Output: 無 Return: 成功返回0,失敗返回-1 Others: *************************************************/int hv_writeIni(char *filename,char *section,char *item,char *value){ FILE *fp; char val[HV_INI_MAX_LEN]; char buf[2*HV_INI_MAX_LEN]; /*當section和item都不存在時,buf為兩行*/ int n; /*變量的初始化*/ n = 0; /*查找要插入的位置*/ if((fp = fopen(filename,"r"))==NULL) { printf("Cannot read file:%s\n",filename); return INI_OP_FAIL; } n = getItem(fp,section,item,val); fclose(fp); /*插入內容*/ if( n != 0 ) { /*修改或是在確定行數中插入時*/ snprintf(buf,HV_INI_MAX_LEN,"%s=%s",item,value); } else { /*在文件最后插入時*/ snprintf(buf,2*HV_INI_MAX_LEN,"[%s]\n%s=%s",section,item,value); } writeLine(filename,buf,n); return INI_OP_SUCCEE;}/*-----------------------------------------------*//* 以下為內部函數 *//*-----------------------------------------------*//************************************************* Function: int fgetline(FILE *fp, char *buffer, int maxlen); Description: 設置ini文件中的一行。放入buffer中,返回讀取的字數 Calls: Called By: Table Accessed: 無 Table Updated: 無 Input: Output: 無 Return: 文件結束返回-1,出現錯誤返回-2,成功返回讀到的字數. Others: *************************************************/int fgetline(FILE *fp, char *buffer, int maxlen){ int i; memset(buffer, 0x00, maxlen); if(fgets(buffer, maxlen, fp) == NULL) { i = strlen(buffer); if(feof(fp) != 0) { if(i == 0) return -1; /* 文件結束 */ } else return -2; /* 出現錯誤 */ } i = strlen(buffer); if(i > 0 && buffer[i-1] == '\n') buffer[--i] = '\0'; return i;}/************************************************* Function: int getItem(FILE *fp,char *section,char *item,char *val) Description: 從fp文件中找到對應section下的Item,返回Item所在的行數 正數為Item所在的行(存該section和Item); 負數為section所在的行(存在section但不存在item); 0為不存該section也不存在該Item Calls: fgetline(fp,buf,HV_INI_MAX_LEN) Called By: 1. hv_readIni() 2. hv_writeIni() Table Accessed: 無 Table Updated: 無 Input: Output: 無 Return: 存在要找的section,不存在item返回負的section的行數; 不存在要找的section和item,返回HV_INI_NO_EXIST 成功返回item的行數. Others: *************************************************/int getItem(FILE *fp,char *section,char *item,char *val){ int n; int valP; /*用于記錄在item行掃描時的位置*/ int isItem; int itemLength; int line_no; int section_line ; char buf[HV_INI_MAX_LEN]; line_no = 0; section_line = line_no; itemLength = strlen(item); /*第一次掃描,尋找section*/ while(1) { n=fgetline(fp,buf,HV_INI_MAX_LEN); if(n<0) { return HV_INI_NO_EXIST; } line_no++; /*如果本行為空或是以;開頭,跳過*/ if(n == 0 || buf[0] == ';') { continue; } /*以行不是以[或是{開頭和發]或是}結尾的,或是不到3個的,跳過*/ if(n<3 || ( (buf[0]=='[' && buf[n-1] != ']') || (buf[0]=='{' && buf[n-1] != '}') ) ) { continue; } if(buf[0] == '[' || buf[0] == '{') { buf[n-1] = 0x00; if(strcmp(buf+1, section) == 0) break; } } /*找到Item*/ section_line = line_no; while(1) { n = 0; isItem = 0; n = fgetline(fp,buf,HV_INI_MAX_LEN); if(n<0) { return -section_line; /*不存在Item*/ } line_no++; if(n == 0 || buf[0] == ';')/*空行或是注釋*/ { continue; } if(n>2 && (buf[0] == '[' || buf[0] == '{'))/*已經到下一個section了*/ { return -section_line; } if(n>1) { valP=0; while(valP<strlen(buf)) { if(buf[valP]==' ' || buf[valP] == '\t') { valP++; continue; } break; } isItem = memcmp(buf+valP,item,itemLength); valP += itemLength; if(isItem == 0) { while(valP<strlen(buf)) { if(buf[valP]==' ' || buf[valP] == '\t') { valP++; continue; } break; } if(buf[valP] == '=') { valP++; while(valP<strlen(buf)) { if(buf[valP]==' ' || buf[valP] == '\t') { valP++; continue; } break; } memcpy(val,buf+valP,n-valP); val[n-valP]='\0'; return line_no; } return -section_line; } continue; } } val[0] = '\0'; return HV_INI_NO_EXIST;}/************************************************* Function: int writeLine(char *filename,char *buf,int line_no) Description: 在文件filename中的第line_no行插入buf. Calls: fgetline(fp,val,HV_INI_MAX_LEN) Called By: hv_writeIni Table Accessed: 無 Table Updated: 無 Input: 1 filename,插入的文件名。 2 buf,插入的內容。 3 line_no,插入的行數。 Output: 無 Return: Others: *************************************************/int writeLine(char *filename,char *buf,int line_no){ FILE *fp; FILE *tempfp; char val[HV_INI_MAX_LEN]; char tempfile[HV_FILE_NAME_LEN]; int n; int line; line = 0; memcpy(tempfile,filename,strlen(filename)); sprintf(tempfile,"%s.%d.temp",filename,getpid); memcpy(tempfile+strlen(filename),".temp",5); tempfp = fopen(tempfile,"w+"); fp = fopen(filename,"r"); while(1) { n = fgetline(fp,val,HV_INI_MAX_LEN); if(n<0) { break; } line++; if(line_no > 0 && line==line_no )/*line_no為正數,而且就是當前行的時候,修改*/ { snprintf(val,HV_INI_MAX_LEN,"%s",buf); } if(line_no < 0 && line == -line_no )/*line_no為負數,而且其絕對等于line時,在后面補上*/ { fprintf(tempfp,"%s\n",val); memcpy(val,buf,strlen(buf)); } fprintf(tempfp,"%s\n",val); } fclose(fp); if(line_no == 0) { fprintf(tempfp,"%s\n",buf); } fclose(tempfp); /*再寫進去*/ fp = fopen(filename,"w"); tempfp = fopen(tempfile,"r"); while(1) { n = fgetline(tempfp,val,HV_INI_MAX_LEN); if(n>=0) { fprintf(fp,"%s\n",val); } else { break; } } fclose(tempfp); fclose(fp); /*刪除臨時文件*/ remove(tempfile); return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -