在C语言中读取INI文件通常需要手动解析,因为C标准库没有提供直接读取INI文件的函数。你可以通过读取文件内容并逐行解析来获取INI文件中的键值对。下面是一个简单的示例程序,展示如何读取和解析INI文件:
INI 文件示例
假设有一个名为config.ini
的INI文件,内容如下:
[database]
user = admin
password = secret
host = localhost
port = 3306
C代码示例
以下代码演示了如何读取并解析上述INI文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LENGTH 1024
// Function to trim leading and trailing whitespace
char* trim_whitespace(char* str) {
char* end;
// Trim leading space
while(isspace((unsigned char)*str)) str++;
if(*str == 0) // All spaces?
return str;
// Trim trailing space
end = str + strlen(str) - 1;
while(end > str && isspace((unsigned char)*end)) end--;
// Write new null terminator
*(end + 1) = 0;
return str;
}
// Function to parse INI file
void parse_ini_file(const char* filename) {
FILE *file = fopen(filename, "r");
if (!file) {
perror("Error opening file");
return;
}
char line[MAX_LINE_LENGTH];
char section[MAX_LINE_LENGTH] = "";
while (fgets(line, sizeof(line), file)) {
char *trimmed_line = trim_whitespace(line);
// Skip comments and empty lines
if (trimmed_line[0] == ';' || trimmed_line[0] == '#' || trimmed_line[0] == '\0') {
continue;
}
// Handle section headers
if (trimmed_line[0] == '[') {
char *closing_bracket = strchr(trimmed_line, ']');
if (closing_bracket) {
*closing_bracket = '\0';
strncpy(section, trimmed_line + 1, sizeof(section) - 1);
section[sizeof(section) - 1] = '\0';
}
}
// Handle key-value pairs
else {
char *delimiter = strchr(trimmed_line, '=');
if (delimiter) {
*delimiter = '\0';
char *key = trim_whitespace(trimmed_line);
char *value = trim_whitespace(delimiter + 1);
// Output the section, key, and value
printf("[%s] %s = %s\n", section, key, value);
}
}
}
fclose(file);
}
int main() {
parse_ini_file("config.ini");
return 0;
}
代码说明
- 读取文件: 使用
fopen
函数打开INI文件,并检查文件是否成功打开。 - 逐行读取: 使用
fgets
函数逐行读取文件内容。 - 跳过注释和空行: 检查每行的第一个字符,跳过以
;
、#
开头的行以及空行。 - 处理节(section): 如果行以
[
开头并以]
结尾,将其视为一个节,并保存节名。 - 处理键值对: 如果行包含
=
,将其视为键值对,分割键和值,并去除两边的空白字符。 - 输出结果: 打印节名、键和值。
执行程序
编译并运行上述程序,它将解析config.ini
文件并打印其中的节名、键和值:
gcc -o parse_ini parse_ini.c
./parse_ini
输出将会是:
[database] user = admin
[database] password = secret
[database] host = localhost
[database] port = 3306
这种方法是手动解析INI文件的一种简单方法,可以根据需要扩展处理更复杂的INI文件格式。