日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用C语言实现解析简单配置文件的小工具

發布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用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);??
  • ??
  • ????/*?打開地址描述的C語言源文件?*/??
  • ????if((cf?=?fopen(ADDRS_C_FILE_NAME,?"wt"))?==?NULL)??
  • ????{??
  • ????????printf("Can\'t?open?%s!\n",?ADDRS_C_FILE_NAME);??
  • ????????return?-1;??
  • ????}??
  • ??
  • ????/*?把各個資源的地址和長度信息寫入C語言數組?*/??
  • ????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语言实现解析简单配置文件的小工具的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。