文件读写综合案例
读写配置文件
配置文件格式如下:
- 正式的数据以‘:’冒号进行分割:
- 冒号前为key起到索引作用
- 冒号后为value是实值。
- #开头的为注释,而不是正式数据
config.txt
配置文件里填入英雄基本信息:
#英雄的Id heroId:1 #英雄的姓名 heroName:德玛西亚 #英雄的攻击力 heroAtk:1000 #英雄的防御力 heroDef:500 #英雄的简介 heroInfo:前排坦克
出现问题:解决中文乱码
直接用fgets的话,读取txt文本一般会出现乱码问题,请参考另一篇博文进行解决:
https://yangyongli.blog.csdn.net/article/details/121024950
代码
#include<stdio.h> #include<stdlib.h> #include<string.h> struct ConfigInfo { char key[64]; char value[64]; }; //获取指定的配置信息 char * getInfoByKey(char * key, struct ConfigInfo*configInfo, int lines) { for (int i = 0; i < lines; i++) { if (strcmp(key, configInfo[i].key) == 0) { // printf("测试:%s\n", configInfo[i].value); return configInfo[i].value; } } return NULL; } //释放配置文件信息 void freeConfigInfo(struct ConfigInfo*configInfo) { free(configInfo); configInfo = NULL; } //判断当前行是否为有效行 int isValidLine(char * buf) { if (buf[0] == '0' || buf[0] == '\0' || strchr(buf, ':') == NULL) { return 0;// 如果行无限 返回假 } return 1; } //获取文件有效行数 int getFileLine(const char * filePath) { FILE * file = fopen(filePath, "r"); char buf[1024] = { 0 }; int lines = 0; while (fgets(buf, 1024, file) != NULL) { if (isValidLine(buf)) { lines++; } memset(buf, 0, 1024); } fclose(file); return lines; } //解析文件 void parseFile(const char * filePath, int lines, struct ConfigInfo** configInfo) { struct ConfigInfo * pConfig = malloc(sizeof(struct ConfigInfo) * lines); if (pConfig == NULL) { return; } FILE * file = fopen(filePath, "r"); char buf[1024] = { 0 }; int index = 0; while (fgets(buf, 1024, file) != NULL) { if (isValidLine(buf)) { //解析数据到struct ConfigInfo中 memset(pConfig[index].key, 0, 64); memset(pConfig[index].value, 0, 64); char * pos = strchr(buf, ':'); strncpy(pConfig[index].key, buf, pos - buf); strncpy(pConfig[index].value, pos + 1, strlen(pos + 1) - 1); // 从第二个单词开始截取字符串,并且不截取换行符 // printf("key = %s\n", pConfig[index].key); // printf("value = %s\n", pConfig[index].value); index++; } memset(buf, 0, 1024); } *configInfo = pConfig; } int main() { char * filePath = "./config.txt"; int lines = getFileLine(filePath); printf("文件有效行数为:%d\n", lines); struct ConfigInfo * config = NULL; parseFile(filePath, lines, &config); printf("heroId = %s\n", getInfoByKey("heroId", config, lines)); printf("heroName: = %s\n", getInfoByKey("heroName", config, lines)); printf("heroAtk = %s\n", getInfoByKey("heroAtk", config, lines)); printf("heroDef: = %s\n", getInfoByKey("heroDef", config, lines)); printf("heroInfo: = %s\n", getInfoByKey("heroInfo", config, lines)); freeConfigInfo(config); config = NULL; system("pause"); return EXIT_SUCCESS; }
运行结果: