Example Configuration File Loader in C
I’ve been playing around in C more lately, and made a really simple configuration loader that behaves kind of like a simplified version of INI files. So far it just supports string, int and float configuration settings, and a fixed number of total configuration settings.
Sample Usage Code:
settings config;
settings_load(&config, "settings.ini");
//for(int i = 0; i < config.count; i++)
// printf("%s, %s\n", config.list[i].key, config.list[i].value);
char *name = settings_read_string(&config, "name", "<none>");
int age = settings_read_int(&config, "age", 0);
float cool_factor = settings_read_float(&config, "cool_factor", 10.0);
printf("name: %s\n", name);
printf("age: %d\n", age);
printf("cool_factor: %4.1f\n", cool_factor);
settings.h
#ifndef _SETTINGS_H_
#define _SETTINGS_H_
#define MAX_SETTINGS 512
#define MAX_KEY_LENGTH 255
#define MAX_VALUE_LENGTH 255
typedef struct keyvaluepair_t {
char key[MAX_KEY_LENGTH];
char value[MAX_VALUE_LENGTH];
} keyvaluepair;
typedef struct settings_t {
int count;
keyvaluepair list[MAX_SETTINGS];
} settings;
int settings_load(settings *settings, const char *name);
char *settings_read_string(settings *settings, const char *name, char *default_value);
int settings_read_int(settings *settings, const char *name, int default_value);
float settings_read_float(settings *settings, const char *name, float default_value);
#endif
settings.c
#include "settings.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int settings_load(settings *settings, const char *filename)
{
FILE *pFile;
char buffer[1024];
char *key, *value;
int index = 0;
pFile = fopen(filename, "r");
if (pFile != NULL) {
while(fgets(buffer, 1024, pFile) != NULL) {
key = strtok(buffer, "=\r\n");
value = strtok(NULL, "=\r\n");
if(key != NULL && value != NULL) {
strcpy_s(settings->list[settings->count].key, MAX_KEY_LENGTH, key);
strcpy_s(settings->list[settings->count].value, MAX_VALUE_LENGTH, value);
settings->count++;
}
}
fclose(pFile);
}
return 0;
}
char *settings_read_string(settings *settings, const char *name, char *default_value)
{
for(int i = 0; i < settings->count; i++)
{
if(strcmp(name, settings->list[i].key) == 0)
{
return settings->list[i].value;
}
}
return default_value;
}
int settings_read_int(settings *settings, const char *name, int default_value)
{
for(int i = 0; i < settings->count; i++)
{
if(strcmp(name, settings->list[i].key) == 0)
{
return strtol(settings->list[i].value, NULL, 10);
}
}
return default_value;
}
float settings_read_float(settings *settings, const char *name, float default_value)
{
for(int i = 0; i < settings->count; i++)
{
if(strcmp(name, settings->list[i].key) == 0)
{
return strtof(settings->list[i].value, NULL);
}
}
return default_value;
}

