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

发布于:2024-06-01 ⋅ 阅读:(193) ⋅ 点赞:(0)

在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;
}

代码说明

  1. 读取文件: 使用fopen函数打开INI文件,并检查文件是否成功打开。
  2. 逐行读取: 使用fgets函数逐行读取文件内容。
  3. 跳过注释和空行: 检查每行的第一个字符,跳过以#开头的行以及空行。
  4. 处理节(section): 如果行以[开头并以]结尾,将其视为一个节,并保存节名。
  5. 处理键值对: 如果行包含=,将其视为键值对,分割键和值,并去除两边的空白字符。
  6. 输出结果: 打印节名、键和值。

执行程序

编译并运行上述程序,它将解析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文件格式。


网站公告

今日签到

点亮在社区的每一天
去签到