配置文件怎么写?新手入门教程详解
- 虚拟主机
- 2026-02-07
- 2488
在 C 语言中处理配置文件通常有以下几种方法,下面我将介绍两种主流方案,并提供完整示例代码:

方案 1:使用 INI 格式配置文件(轻量级推荐)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_LINE_LENGTH 256 #define MAX_KEY_LENGTH 50 #define MAX_VALUE_LENGTH 100 // 配置结构体 typedef struct { char server_ip[MAX_VALUE_LENGTH]; int port; int debug_mode; float timeout; } Config; // 去除字符串两端空白 void trim(char *str) { char *end; while(isspace((unsigned char)*str)) str++; if(*str == 0) return; end = str + strlen(str) - 1; while(end > str && isspace((unsigned char)*end)) end--; *(end+1) = 0; } // 解析配置文件 int parse_config(const char *filename, Config *config) { FILE *file = fopen(filename, "r"); if (!file) { perror("Error opening file"); return 0; } char line[MAX_LINE_LENGTH]; char key[MAX_KEY_LENGTH]; char value[MAX_VALUE_LENGTH]; while (fgets(line, sizeof(line), file)) { // 跳过注释和空行 if (line[0] == '#' || line[0] == 'n' || line[0] == ';') continue; // 分割键值对 if (sscanf(line, "%[^=]=%s", key, value) == 2) { trim(key); trim(value); // 处理不同配置项 if (strcmp(key, "server_ip") == 0) { strncpy(config->server_ip, value, sizeof(config->server_ip)); } else if (strcmp(key, "port") == 0) { config->port = atoi(value); } else if (strcmp(key, "debug_mode") == 0) { config->debug_mode = (strcasecmp(value, "true") == 0) ? 1 : 0; } else if (strcmp(key, "timeout") == 0) { config->timeout = atof(value); } } } fclose(file); return 1; } int main() { Config my_config = { .server_ip = "127.0.0.1", // 默认值 .port = 8080, .debug_mode = 0, .timeout = 5.0 }; if (parse_config("config.ini", &my_config)) { printf("Loaded configuration:n"); printf("Server IP: %sn", my_config.server_ip); printf("Port: %dn", my_config.port); printf("Debug Mode: %sn", my_config.debug_mode ? "ON" : "OFF"); printf("Timeout: %.1f secondsn", my_config.timeout); } else { printf("Using default configurationn"); } return 0; }
示例配置文件 config.ini:
# 服务器配置 server_ip = 192.168.1.100 port = 8080 # 调试设置 debug_mode = true # 超时设置 (秒) timeout = 3.5
方案 2:使用 JSON 格式(需要第三方库 cJSON)
#include <stdio.h> #include "cJSON.h" // 需要 cJSON 库 typedef struct { char server_ip[16]; int port; int debug_mode; double timeout; } Config; int parse_json_config(const char *filename, Config *config) { FILE *file = fopen(filename, "r"); if (!file) return 0; fseek(file, 0, SEEK_END); long size = ftell(file); fseek(file, 0, SEEK_SET); char *json_data = malloc(size + 1); fread(json_data, 1, size, file); fclose(file); json_data[size] = 0; cJSON *root = cJSON_Parse(json_data); if (!root) { free(json_data); return 0; } cJSON *item; if ((item = cJSON_GetObjectItem(root, "server_ip"))) strncpy(config->server_ip, item->valuestring, sizeof(config->server_ip)); if ((item = cJSON_GetObjectItem(root, "port"))) config->port = item->valueint; if ((item = cJSON_GetObjectItem(root, "debug_mode"))) config->debug_mode = cJSON_IsTrue(item); if ((item = cJSON_GetObjectItem(root, "timeout"))) config->timeout = item->valuedouble; cJSON_Delete(root); free(json_data); return 1; }
最佳实践建议:
-
格式选择:
- 简单配置:INI 格式(轻量无需依赖)
- 复杂配置:JSON/XML(需要第三方库)
- 系统级配置:考虑 libconfig 库
-
安全注意事项:

- 始终验证输入数据
- 使用 strncpy 代替 strcpy
- 检查数值范围(如端口号 0-65535)
- 处理文件不存在的情况
-
错误处理:
- 提供默认值
- 详细的错误日志
- 配置文件版本兼容性检查
-
高级方案:
// 使用 libconfig 库示例 #include <libconfig.h> config_init(&cfg); if (!config_read_file(&cfg, "app.cfg")) { fprintf(stderr, "%s:%d - %sn", config_error_file(&cfg), config_error_line(&cfg), config_error_text(&cfg)); config_destroy(&cfg); exit(EXIT_FAILURE); } config_lookup_int(&cfg, "port", &port); config_lookup_string(&cfg, "server_ip", &ip_str); - 使用分组组织相关设置
- 添加注释说明每个配置项
- 包含版本信息
- 支持环境变量覆盖(如 ${HOME})
- 提供配置验证工具
配置文件设计原则:
根据项目需求选择合适方案,小型项目推荐 INI 格式,企业级应用建议使用 libconfig 或类似的成熟配置库。
