生活随笔
收集整理的這篇文章主要介紹了
用C语言实现解析简单配置文件的小工具
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文介紹作者寫的一個小工具,簡單的代碼中包含了C語言對字符串的處理技巧,對文本文件的簡單解析,二進制文件的數據復制的方法,以及格式化輸出文本文件的示例。
工具的輸入是如下內容的配置文件:
?
[plain]?view plaincopy
;資源管理器配置腳本????;以行為單位,每行不能超過255個字符??;空行和以;開頭的注釋行會被忽略掉??;每行都關聯一個資源文件,資源序號從0開始,依次遞增????.\img\img128x128.bin??.\snd\start.wav??.\img\sheis1.bin??.\snd\balloon.wav??.\img\sheis2.bin?? 工具的源代碼貼在這里:
?
[cpp]?view plaincopy
#include?<ctype.h>??#include?<string.h>??#include?<stdlib.h>??#include?<stdio.h>??????#define?CONFIG_FILE_NAME????????("config.txt")??#define?RESPAK_FILE_NAME????????("resmm.bin")??#define?ADDRS_C_FILE_NAME???????("resmm_addrs.c")??????#define?LINE_CHARS??????(255)????#define?BUF_SIZE????????(8?*?1024)??????static?char*?extract_file_name(const?char*?line,?char*?file_name)??{????????????while(isspace(*line++)){};??????line--;????????????if((*line?==?'\0')?||?(*line?==?';'))??????????return?NULL;??????????????strcpy(file_name,?line);??????{??????????char*?p?=?file_name?+?strlen(file_name)?-?1;??????????while(isspace(*p--)){};??????????p++;??????????p++;??????????*p?=?'\0';??????}????????return?file_name;??}??????static?int?scan_file_count(FILE*?cf)??{??????char?line[LINE_CHARS?+?1];??????char?file_name[LINE_CHARS?+?1];??????int?count?=?0;????????while(!feof(cf))??????{??????????fgets(line,?LINE_CHARS,?cf);??????????if(extract_file_name(line,?file_name)?!=?NULL)??????????????count++;??????}????????return?count;??}??????static?size_t?copy_file_datas(FILE*?pf,?FILE*?rf)??{??????unsigned?char?buf[BUF_SIZE];??????size_t?total?=?0;??????size_t?len;????????do{??????????len?=?fread(buf,?sizeof(unsigned?char),?BUF_SIZE,?rf);??????????fwrite(buf,?sizeof(unsigned?char),?len,?pf);??????????total?+=?len;??????}while(len?==?BUF_SIZE);????????return?total;??}??????int?main(int?argc,?char*?argv[])??{??????FILE*?cf;??????FILE*?pf;??????FILE*?rf;??????int?count;??????size_t*?lens;??????size_t?len;??????unsigned?int?addr;??????char?line[LINE_CHARS?+?1];??????char?file_name[LINE_CHARS?+?1];??????int?i;??????????????if((cf?=?fopen(CONFIG_FILE_NAME,?"rt"))?==?NULL)??????{??????????printf("Can\'t?open?%s!\n",?CONFIG_FILE_NAME);??????????return?-1;??????}??????count?=?scan_file_count(cf);??????fseek(cf,?0L,?SEEK_SET);??????????????if((pf?=?fopen(RESPAK_FILE_NAME,?"wb"))?==?NULL)??????{??????????printf("Can\'t?create?%s!\n",?RESPAK_FILE_NAME);??????????fclose(cf);??????????return?-1;??????}??????????????if((lens?=?(size_t*)malloc(sizeof(size_t)?*?count))?==?NULL)??????{??????????printf("No?enough?memory!\n");??????????fclose(pf);??????????fclose(cf);??????????return?-1;??????}??????i?=?0;??????while(!feof(cf))??????{??????????fgets(line,?LINE_CHARS,?cf);??????????if(extract_file_name(line,?file_name)?!=?NULL)??????????{??????????????if((rf?=?fopen(file_name,?"rb"))?==?NULL)??????????????{??????????????????printf("Can\'t?open?%s!\n",?file_name);??????????????????fclose(pf);??????????????????fclose(cf);??????????????????return?-1;??????????????}??????????????if((len?=?copy_file_datas(pf,?rf))?==?0)??????????????{??????????????????printf("File?%s?is?empty!\n",?file_name);??????????????????fclose(pf);??????????????????fclose(cf);??????????????????return?-1;??????????????}??????????????lens[i++]?=?len;??????????????fclose(rf);??????????}??????}??????fclose(pf);??????fclose(cf);??????????????if((cf?=?fopen(ADDRS_C_FILE_NAME,?"wt"))?==?NULL)??????{??????????printf("Can\'t?open?%s!\n",?ADDRS_C_FILE_NAME);??????????return?-1;??????}??????????????fprintf(cf,?"#define?RES_COUNT\t(%d)\n\n",?count);??????fprintf(cf,?"static?const?INT32U?addrs[RES_COUNT]?=?\n{\n");??????addr?=?0;??????for(i?=?0;?i?<?count;?i++)??????{??????????fprintf(cf,?"\t\t0x%08x,\n",?addr);??????????addr?+=?lens[i];??????}??????fprintf(cf,?"};\n\n");??????fprintf(cf,?"static?const?INT32U?lens[RES_COUNT]?=?\n{\n");??????for(i?=?0;?i?<?count;?i++)??????????fprintf(cf,?"\t\t0x%08x,\n",?lens[i]);??????fprintf(cf,?"};");????????fclose(cf);??????free(lens);??????return?0;??}?? 格式化輸出的文本文件是這樣的:
?
?
?
[cpp]?view plaincopy
#define?RES_COUNT???(5)????static?const?INT32U?addrs[RES_COUNT]?=???{??????????0x00000000,??????????0x00008000,??????????0x0000889a,??????????0x0001089a,??????????0x0001219a,??};????static?const?INT32U?lens[RES_COUNT]?=???{??????????0x00008000,??????????0x0000089a,??????????0x00008000,??????????0x00001900,??????????0x00008000,??}; ?
轉載于:https://www.cnblogs.com/pengkunfan/p/3486604.html
總結
以上是生活随笔為你收集整理的用C语言实现解析简单配置文件的小工具的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。