├── Makefile ├── README.md ├── config.ini ├── libini.c ├── libini.h └── test.c /Makefile: -------------------------------------------------------------------------------- 1 | CROSS_COMPILE ?= 2 | CC := $(CROSS_COMPILE)gcc 3 | STRIP := $(CROSS_COMPILE)strip 4 | AR := $(CROSS_COMPILE)ar 5 | CFLAGS += -g -Wall 6 | DLIB = libini.so 7 | SLIB = libini.a 8 | 9 | all: libini.o 10 | $(CC) $(CFLAGS) -FPIC -shared $^ -o $(DLIB) 11 | $(AR) -rc $(SLIB) $^ 12 | 13 | clean: 14 | rm -rf *.o 15 | rm $(DLIB) $(SLIB) 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # libini 2 | 非常小的读取、写入ini配置文件c库. 3 | 支持字符串、整形、长整型、浮点型. 4 | 注释是"//"、"#"、";". 5 | 支持等号右有若干空格. 6 | 支持单一右边所有字符,支持两种格式一种是带引号和不带引号的key 7 | 8 | # build 9 | git clone https://github.com/niuyuling/libini 10 | cd libini 11 | make 12 | 13 | # test 14 | gcc -Wall test.c -o test -L./ -lini -static 15 | ./test -------------------------------------------------------------------------------- /config.ini: -------------------------------------------------------------------------------- 1 | [CAT] 2 | age = "1343567"; 3 | name="aixiao.me"; 4 | 5 | a ="10"; 6 | b= 1234567890 7 | c = 1.223445446 8 | 9 | 10 | [TAC] 11 | e = abcdef!@#$%^&*()_+ 12 | f=123 13 | 14 | -------------------------------------------------------------------------------- /libini.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "libini.h" 5 | 6 | #define BUFFER_SIZE 1024 7 | 8 | // 去除str前的"和后的"; 9 | char *delchar(char *str, char *temp) 10 | { 11 | int len = strlen(str); 12 | char *p1 = str; 13 | if ((0 == strncmp("\"", str, 1)) && (str[len - 1] == ';') 14 | && (str[len - 2] == '"')) { 15 | p1[len - 2] = '\0'; 16 | return strcpy(temp, p1 + 1); 17 | } else { 18 | return str; 19 | } 20 | return str; 21 | } 22 | 23 | // 去除字符空格 24 | char *del_space(char *str, char *buf) 25 | { 26 | unsigned int uLen = strlen(str); 27 | 28 | if (0 == uLen) { 29 | return '\0'; 30 | } 31 | 32 | memset(buf, 0, uLen + 1); 33 | 34 | unsigned int i = 0, j = 0; 35 | for (i = 0; i < uLen + 1; i++) { 36 | if (str[i] != ' ') { 37 | buf[j++] = str[i]; 38 | } 39 | } 40 | buf[j] = '\0'; 41 | 42 | return buf; 43 | } 44 | 45 | // 创建临时内存 46 | int libini_memory(char **pp) 47 | { 48 | if (pp != NULL) { 49 | char *tmp = (char *)malloc(BUFFER_SIZE); 50 | if (tmp != NULL) { 51 | *pp = tmp; // pp的地址指向tmp 52 | return 1; 53 | } 54 | } 55 | return -1; 56 | } 57 | 58 | // 释放临时内存 59 | void libini_free(char *p) 60 | { 61 | if (p != NULL) { 62 | free(p); 63 | } 64 | } 65 | 66 | int getinikeystring(char *title, char *key, char *filename, char *buf) 67 | { 68 | bzero(buf, 0); 69 | FILE *fp; 70 | int flag = 0; 71 | char sTitle[BUFFER_SIZE], *wTmp; 72 | char sLine[BUFFER_SIZE]; 73 | sprintf(sTitle, "[%s]", title); 74 | char buf1[BUFFER_SIZE]; 75 | 76 | if (NULL == (fp = fopen(filename, "r"))) { 77 | perror("fopen"); 78 | return -1; 79 | } 80 | while (NULL != fgets(sLine, BUFFER_SIZE, fp)) { 81 | if (0 == strncmp("//", sLine, 2)) 82 | continue; 83 | if (sLine[0] == '#' || 0 == strncmp("#", sLine, 1)) 84 | continue; 85 | if (sLine[0] == ';' || 0 == strncmp(";", sLine, 1)) 86 | continue; 87 | wTmp = strchr(sLine, '='); 88 | if ((NULL != wTmp) && (1 == flag)) { 89 | sLine[strlen(sLine) - 1] = '\0'; 90 | 91 | //if (0 == strncmp(key, sLine, strlen(key)) && !(strncasecmp(strtok(sLine, "="), key, strlen(strtok(sLine, "="))))) { 92 | if (0 == strncmp(key, sLine, strlen(key)) && 93 | !(strncasecmp 94 | (del_space(strtok(sLine, "="), buf1), key, 95 | strlen(del_space(strtok(sLine, "="), buf1))))) { // 判断key长度的等号左边字符是否相等, 判断key长度的等号左边字符(去除空格)是否相等 96 | fclose(fp); 97 | while (*(wTmp + 1) == ' ') { 98 | wTmp++; 99 | } 100 | delchar(strcpy(buf, wTmp + 1), buf); 101 | return 0; 102 | } 103 | } else { 104 | if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { 105 | flag = 1; 106 | } 107 | } 108 | } 109 | fclose(fp); 110 | return -1; 111 | } 112 | 113 | int putinikeystring(char *title, char *key, char *val, char *filename) 114 | { 115 | char buf[BUFFER_SIZE]; 116 | FILE *fpr; 117 | FILE *fpw; 118 | int flag = 0; 119 | char sLine[BUFFER_SIZE], sTitle[BUFFER_SIZE], *wTmp; 120 | char sLine_backup[BUFFER_SIZE]; 121 | sprintf(sTitle, "[%s]", title); 122 | if (NULL == (fpr = fopen(filename, "r"))) 123 | return -1; 124 | sprintf(sLine, "%s.tmp", filename); 125 | if (NULL == (fpw = fopen(sLine, "w"))) 126 | return -1; 127 | while (NULL != fgets(sLine, BUFFER_SIZE, fpr)) { 128 | if (2 != flag) { 129 | wTmp = strchr(sLine, '='); 130 | if ((NULL != wTmp) && (1 == flag)) { 131 | strcpy(sLine_backup, sLine); 132 | if (0 == strncmp(key, sLine, strlen(key)) 133 | && 134 | !(strncasecmp 135 | (del_space(strtok(sLine_backup, "="), buf), key, 136 | strlen(del_space(strtok(sLine_backup, "="), buf))))) { 137 | flag = 2; 138 | sprintf(wTmp + 1, "%s\n", val); 139 | } 140 | } else { 141 | if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { 142 | flag = 1; 143 | } 144 | } 145 | } 146 | fputs(sLine, fpw); 147 | } 148 | fclose(fpr); 149 | fclose(fpw); 150 | sprintf(sLine, "%s.tmp", filename); 151 | return rename(sLine, filename); 152 | } 153 | 154 | int getinikeyint(char *title, char *key, char *filename) 155 | { 156 | char buf[BUFFER_SIZE]; 157 | getinikeystring(title, key, filename, buf); 158 | return atoi(buf); 159 | } 160 | 161 | long int getinikeylong(char *title, char *key, char *filename) 162 | { 163 | char buf[BUFFER_SIZE]; 164 | getinikeystring(title, key, filename, buf); 165 | return atol(buf); 166 | } 167 | 168 | float getinikeyfloat(char *title, char *key, char *filename) 169 | { 170 | char buf[BUFFER_SIZE]; 171 | getinikeystring(title, key, filename, buf); 172 | return atof(buf); 173 | } 174 | -------------------------------------------------------------------------------- /libini.h: -------------------------------------------------------------------------------- 1 | #ifndef LIBINI_H 2 | #define LIBINI_H 3 | 4 | int getinikeystring(char *title, char *key, char *filename, char *buf); 5 | int putinikeystring(char *title, char *key, char *val, char *filename); 6 | int getinikeyint(char *title, char *key, char *filename); 7 | long getinikeylong(char *title, char *key, char *filename); 8 | float getinikeyfloat(char *title, char *key, char *filename); 9 | int libini_memory(char **pp); 10 | void libini_free(char *p); 11 | 12 | #endif 13 | -------------------------------------------------------------------------------- /test.c: -------------------------------------------------------------------------------- 1 | #include "libini.h" 2 | #include 3 | #include 4 | 5 | int main(void) 6 | { 7 | char *tmp = NULL; 8 | libini_memory(&tmp); // 创建内存 9 | 10 | getinikeystring("CAT", "age", "config.ini", tmp); // 字符串 11 | printf("%s\n", tmp); 12 | 13 | getinikeystring("CAT", "name", "config.ini", tmp); // 字符串 14 | printf("%s\n", tmp); 15 | 16 | printf("%d\n", getinikeyint("CAT", "a", "config.ini")); // 整型 17 | printf("%ld\n", getinikeylong("CAT", "b", "config.ini")); // 长整型 18 | printf("%f\n", getinikeyfloat("CAT", "c", "config.ini")); // 浮点型(默认小数点后6位) 19 | 20 | putinikeystring("TAC", "e", " abcdef!@#$%^&*()_+", "config.ini"); // 写入 21 | getinikeystring("TAC", "e", "config.ini", tmp); 22 | printf("%s\n", tmp); 23 | 24 | getinikeystring("TAC", "f", "config.ini", tmp); 25 | printf("%s\n", tmp); 26 | 27 | libini_free(tmp); 28 | return 1; 29 | } 30 | --------------------------------------------------------------------------------