C语言 文件读写综合案例:读取LOL信息

简介: 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;
}


运行结果:


相关文章
|
19天前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
19天前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
19天前
|
C语言
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
|
19天前
|
存储 文件存储 C语言
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南
|
1月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
2月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
43 15
|
2月前
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
|
2月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理
|
2月前
|
存储 数据可视化 C语言
【C语言】C语言-学生籍贯信息记录系统(源码+论文)【独一无二】
【C语言】C语言-学生籍贯信息记录系统(源码+论文)【独一无二】
|
2月前
|
存储 C语言
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】