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

#include

#include

#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

#include

#include

#define MAX_LINE_LENGTH 1024

#define MAX_KEY_LENGTH 256

#define MAX_VALUE_LENGTH 256

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