C语言 文件读写综合案例:读取LOL信息
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 文件读写综合案例:读取LOL信息相关的知识,希望对你有一定的参考价值。
文件读写综合案例
读写配置文件
配置文件格式如下:
- 正式的数据以
‘:’冒号
进行分割:- 冒号前为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;
}
运行结果:
以上是关于C语言 文件读写综合案例:读取LOL信息的主要内容,如果未能解决你的问题,请参考以下文章