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