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;
}


运行结果:


目录
打赏
0
0
0
0
41
分享
相关文章
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
91 5
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
329 3
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
6月前
|
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
6月前
|
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等