C语言读取ini配置文件 手动实现

在C语言中,你可以使用标准库中的文件操作函数来读取INI文件,然后解析其中的内容以找到对应的键和值。以下是一个简单的示例代码,演示如何实现这一过程:

#include <stdio.h>
#include <string.h>#define MAX_LINE_LENGTH 1024
#define MAX_KEY_LENGTH 256
#define MAX_VALUE_LENGTH 256// 函数原型
int read_ini_value(const char *filename, const char *section, const char *key, char *value);int main() {char value[MAX_VALUE_LENGTH];// 读取INI文件中的键值对if (read_ini_value("example.ini", "Section1", "Key1", value)) {printf("Value: %s\n", value);} else {printf("Key not found or file error.\n");}return 0;
}int read_ini_value(const char *filename, const char *section, const char *key, char *value) {FILE *file = fopen(filename, "r");char line[MAX_LINE_LENGTH];char current_section[MAX_KEY_LENGTH];char current_key[MAX_KEY_LENGTH];char current_value[MAX_VALUE_LENGTH];int section_found = 0;if (!file) {return 0; // 文件打开失败}while (fgets(line, sizeof(line), file)) {// 去除行尾的换行符if (line[strlen(line) - 1] == '\n') {line[strlen(line) - 1] = '\0';}// 忽略空行和注释行if (line[0] == ';' || line[0] == '\0') {continue;}// 检查是否为节if (line[0] == '[') {sscanf(line, "[%[^]]", current_section);if (strcmp(current_section, section) == 0) {section_found = 1;} else {section_found = 0;}continue;}// 如果在指定的节中,则查找键值对if (section_found) {sscanf(line, "%[^=]=%s", current_key, current_value);if (strcmp(current_key, key) == 0) {fclose(file);strcpy(value, current_value);return 1; // 找到键值对}}}fclose(file);return 0; // 未找到指定键
}

在这个示例中,假设你有一个名为"example.ini"的INI文件,其内容如下:

[Section1]
Key1=Value1
Key2=Value2[Section2]
Key3=Value3

调用 read_ini_value 函数时,将指定要查找的节名、键名和一个缓冲区来存储找到的值。如果成功找到对应的键值对,则函数返回1,并将值存储在传入的缓冲区中;如果未找到指定键或发生文件错误,则返回0。

将键值对保存到自定义结构

以下是一个简单的手动解析INI文件的示例代码,它逐行读取INI文件,解析出键值对并存储在一个简单的数据结构中:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_LINE_LENGTH 1024
#define MAX_KEY_LENGTH 256
#define MAX_VALUE_LENGTH 256typedef struct {char key[MAX_KEY_LENGTH];char value[MAX_VALUE_LENGTH];
} KeyValuePair;void parse_ini(const char *filename, KeyValuePair *pairs, int *num_pairs) {FILE *file = fopen(filename, "r");if (!file) {fprintf(stderr, "Error: Unable to open file %s\n", filename);exit(1);}char line[MAX_LINE_LENGTH];*num_pairs = 0;while (fgets(line, sizeof(line), file)) {// 去除行尾的换行符if (line[strlen(line) - 1] == '\n') {line[strlen(line) - 1] = '\0';}// 忽略空行和注释行if (line[0] == ';' || line[0] == '\0') {continue;}// 解析键值对char *equal_sign = strchr(line, '=');if (equal_sign) {*equal_sign = '\0';strncpy(pairs[*num_pairs].key, line, MAX_KEY_LENGTH);strncpy(pairs[*num_pairs].value, equal_sign + 1, MAX_VALUE_LENGTH);(*num_pairs)++;}}fclose(file);
}int main() {const char *filename = "example.ini";KeyValuePair pairs[100]; // 假设INI文件中最多有100个键值对int num_pairs;parse_ini(filename, pairs, &num_pairs);// 打印解析结果printf("Parsed %d key-value pairs from %s:\n", num_pairs, filename);for (int i = 0; i < num_pairs; i++) {printf("%s = %s\n", pairs[i].key, pairs[i].value);}return 0;
}

这个示例代码定义了一个 KeyValuePair 结构体,用于存储键值对。parse_ini 函数逐行读取INI文件,解析出键值对并存储在 KeyValuePair 数组中。主函数调用 parse_ini 函数解析INI文件,并打印出解析结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AR和AP重分类(Regroup)[FAGLF101/OBBU/OBBV]

一、为什么AR和AP科目需要重分类 1.1 执行操作的前提(重要) 存在AR的当月总余额在贷方&#xff08;客户贷项凭证、预收账款等&#xff09;或AP的当月总余额在借方&#xff08;供应商贷项凭证、预收账款等&#xff09;&#xff0c;这种情况下无法真实的反映出资产和负债情况&…

阿里云语音合成TTS直播助手软件开发

阿里云的TTS比较便宜&#xff0c;效果比不了开源克隆的那种&#xff0c;比纯机器人效果好一点点 阿里云sambert https://help.aliyun.com/zh/dashscope/developer-reference/quick-start-13 Sambert系列模型 1万字1元 &#xff0c;每主账号每模型每月3万字免费 创建API-KEY htt…

Mac上搭建Python环境:深入探索与高效实践

Mac上搭建Python环境&#xff1a;深入探索与高效实践 在Mac上搭建Python环境&#xff0c;对于开发者来说是一个既具挑战性又充满乐趣的过程。本文将从四个方面、五个方面、六个方面和七个方面详细阐述如何在Mac上成功搭建Python环境&#xff0c;并帮助您更好地理解和应用Pytho…

Linux——多线程(二)

在上一篇博客中我们已经介绍到了线程控制以及对应的函数调用接口&#xff0c;接下来要讲的是真正的多线程&#xff0c;线程安全、线程互斥、同步以及锁。 一、多线程 简单写个多线程的创建、等待的代码 #include<iostream> #include<pthread.h> #include<un…

【C++】list的使用(下)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;操作list对象的接口函数&#xff08;opeartions&#xff09;spliceremoveremove_ifuniquemergesortreverse 结语 前言 本篇博客主要内容&#xff1a;STL…

Flutter 中的 DecoratedSliver 小部件:全面指南

Flutter 中的 DecoratedSliver 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;它提供了丰富的组件和灵活的布局系统来帮助开发者构建美观且高效的用户界面。在 Flutter 的滚动组件体系中&#xff0c;DecoratedBox 是一个用于装饰普通小部件的装饰器…

MySQL 自定义函数(实验报告)

一、实验名称&#xff1a; 自定义函数 二、实验日期&#xff1a; 2024年 6 月 1 日 三、实验目的&#xff1a; 掌握MySQL自定义函数的创建及调用&#xff1b; 四、实验用的仪器和材料&#xff1a; 硬件&#xff1a;PC电脑一台&#xff1b; 配置&#xff1a;内存&#…

如何区分解析亚马逊网站产品搜索结果页HTM代码中广告位( Sponsored)和自然位的产品ASIN及排名

在开发亚马逊产品广告排名插件的时候需要通过页面HTML代码分别找出属于广告位和自然搜索结果的产品ASIN及排名&#xff0c;所以需要找到区分广告位和自然搜索结果的HTML代码属性&#xff1a; 所有搜索结果页的产品不管是广告位还是自然位&#xff0c;都包括在 标签里&#xff…

RTPS协议之Behavior Module

目录 交互要求基本要求RTPS Writer 行为RTPS Reader行为 RTPS协议的实现与Reader匹配的Writer的行为涉及到的类型RTPS Writer实现RTPS WriterRTPS StatelessWriterRTPS ReaderLocatorRTPS StatefulWriterRTPS ReaderProxyRTPS ChangeForReader RTPS StatelessWriter BehaviorBe…

【Vue】Table组件动态最大高度

在使用Vue框架开发项目时&#xff0c;经常会遇到需要调整组件尺寸以适应不同屏幕大小或窗口尺寸的需求。本文将介绍如何为el-table组件动态设置最大高度&#xff0c;以实现响应式布局。 首先&#xff0c;我们需要在模板中为el-table组件添加一个max-height属性&#xff0c;并将…

ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的信任根服务

安全之安全(security)博客目录导读 目录 一、信任根服务 1、非易失性存储 2、根看门狗 3、随机数生成器 4、加密服务 5、硬件强制安全性 本节定义了系统架构必须支持的一般安全属性和能力&#xff0c;以确保RME安全性。 本章扩展了可能属于系统认证配置文件的一部分的其…

find命令相关

find 是 Linux 系统中一个非常强大且常用的命令&#xff0c;用于在文件系统中搜索符合条件的文件或目录。其基本语法结构如下&#xff1a; find [搜索路径] [表达式]搜索路径 指定find命令开始搜索的位置&#xff0c;默认是当前目录.。 表达式 用于定义搜索条件&#xff0c…

C语言| for嵌套循环

for嵌套循环 不管是一个for循环&#xff0c;还是多个for循环嵌套&#xff0c;运行操作顺序都是一样的。 #include <stdio.h> int main(void) { int i, j; for(i0; i<4; i) { printf("问世间情为何物&#xff0c;直教人生死相许。\n&q…

30 分钟内掌握 Mainnet、Testnet 和 Devnet。Devnet是什么??

在区块链技术领域&#xff0c;Mainnet、Testnet 和 Devnet 等术语经常被使用&#xff0c;但也经常被误解。 这三种环境在区块链应用的开发和部署中起着至关重要的作用&#xff0c;但它们的区别和目的却常常被混淆。 让我们踏上探索之旅&#xff0c;揭开 Mainnet、Testnet 和 De…

Simulink中使用ROS1自定义消息

Simulink中使用ROS1自定义消息 简介前提条件操作流程问题一问题二问题三 吐槽 简介 最近在做的项目里需要使用Simulink与ROS联合仿真&#xff0c;这里就遇到了一个问题&#xff0c;Simulink无法直接使用ROS中的自定义消息&#xff0c;需要在MATLAB中生成一下&#xff0c;再引入…

GiantPandaCV | FasterTransformer Decoding 源码分析(六)-CrossAttention介绍

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;FasterTransformer Decoding 源码分析(六)-CrossAttention介绍 GiantPandaCV | FasterTransformer Decoding 源码分析(一)-整体框架介绍-CSDN博客 …

MyBatis系统学习篇 - 分页插件

MyBatis是一个非常流行的Java持久层框架&#xff0c;它简化了数据库操作的代码。分页是数据库查询中常见的需求&#xff0c;MyBatis本身并不直接支持分页功能&#xff0c;但可以通过插件来实现&#xff0c;从而帮助我们在查询数据库的时候更加方便快捷 引入依赖 <dependen…

塑造更智慧的AI:策略与路径探索

提升数据质量&#xff1a; 数据清洗&#xff1a;去除数据中的异常值、缺失值、噪声等干扰因素&#xff0c;确保数据的准确性和一致性。数据标注&#xff1a;为数据集提供准确的标签&#xff0c;以便进行有监督学习。标注的质量直接影响模型的性能。数据增强&#xff1a;通过图像…

nginx一些命令

nginx学习 nginx核心指令&#xff1a; root和alias两者都是用来指定URI和磁盘文件的映射关系 区别在于root会将定义路径与URI路径叠加&#xff0c;而alias只取定义路径 注意&#xff1a;也就是说在使用root请求真实路径是rootpath/uri 也就是文件目录uri/后面的内容 使用alias:…

EVASH品牌EEPROM IC发布会问答

问题1&#xff1a;益华世科技有哪些EEPROM IC&#xff1f; 回答&#xff1a; 益华世科技旗下EVASH品牌提供以下EEPROM IC&#xff1a; EV24C128AEV24C256AEV24C512A 问题2&#xff1a;这几颗芯片有什么优势&#xff1f; 回答&#xff1a; 这些芯片的优势包括&#xff1a; …