在 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 或类似的成熟配置库。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/285089.html

