非原创 C语言读取配置文件

本文介绍了一个C语言编写的配置文件解析器,它能处理空行和注释,使用sscanf函数解析配置信息,提供错误处理功能,用于读取和验证配置文件中的主机名和端口设置。
摘要由CSDN通过智能技术生成

原文链接:C code to read config file and parse directives - Stack Overflow

优点分析:

做了错误处理,能处理空行,评论不用一大堆strcmp

#include <stdio.h>

#define CONFIG_SIZE (256)
#define HOST_SET (1)
#define PORT_SET (2)

typedef struct config {
  unsigned set;
  char host[CONFIG_SIZE];
  unsigned long port;
} CONFIG;

// Parse the buffer for config info. Return an error code or 0 for no error.
int parse_config(char *buf, CONFIG *config) {
  char dummy[CONFIG_SIZE];
  if (sscanf(buf, " %s", dummy) == EOF) return 0; // blank line
  if (sscanf(buf, " %[#]", dummy) == 1) return 0; // comment
  if (sscanf(buf, " host = %s", config->host) == 1) {
    if (config->set & HOST_SET) return HOST_SET; // error; host already set
    config->set |= HOST_SET;
    return 0;
  }
  if (sscanf(buf, " port = %lu", &config->port) == 1) {
    if (config->set & PORT_SET) return PORT_SET; // error; port already set
    config->set |= PORT_SET;
    return 0;
  }
  return 3; // syntax error
}

void init_config(CONFIG *config) {
  config->set = 0u;
}

void print_config(CONFIG *config) {
  printf("[host=%s,port=", config->set & HOST_SET ? config->host : "<unset>");
  if (config->set & PORT_SET) printf("%lu]", config->port); else printf("<unset>]");
}

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fprintf(stderr, "Usage: %s CONFIG_FILE\n", argv[0]);
    return 1;
  }
  FILE *f = fopen(argv[1], "r");
  char buf[CONFIG_SIZE];
  CONFIG config[1];
  init_config(config);
  int line_number = 0;
  while (fgets(buf, sizeof buf, f)) {
    ++line_number;
    int err = parse_config(buf, config);
    if (err) fprintf(stderr, "error line %d: %d\n", line_number, err);
  }
  print_config(config);
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值