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信息的主要内容,如果未能解决你的问题,请参考以下文章

C语言 文件操作相关函数

C语言 文件操作相关函数

R语言读写excel文件2021.2.24

C 语言文件操作 ( 配置文件读写 | 框架搭建 | 写出或更新配置文件 | 读取配置文件 )

c语言文件读写的问题

c语言,关于读取csv文件的数据,(一行有四列)显示在屏幕。下面的代码:列数据