在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文件,并打印出解析结果。