C++11 读写ini
时间: 2023-12-03 11:04:29 浏览: 89
INI 文件是一种常见的配置文件格式,C 语言中可以通过读写 INI 文件来实现程序配置的读取和保存。以下是一个简单的示例代码,使用 C 11 中的标准库函数实现读写 INI 文件。
读取 INI 文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LEN 1024
int read_ini(const char* filename, const char* section, const char* key, char* value, int size)
{
FILE* fp = fopen(filename, "r");
if (!fp) {
return -1;
}
char line[MAX_LINE_LEN];
char* ptr = NULL;
int len = 0;
int in_section = 0;
int found_key = 0;
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
len = strlen(line);
if (len > 0 && line[len - 1] == '\n') {
line[len - 1] = '\0';
}
if (line[0] == '[' && line[len - 1] == ']') {
ptr = strstr(line, section);
if (ptr != NULL && ptr == line + 1) {
in_section = 1;
} else {
in_section = 0;
}
} else if (in_section) {
ptr = strstr(line, key);
if (ptr != NULL && ptr == line) {
ptr = strchr(line, '=');
if (ptr != NULL) {
ptr = ptr + 1;
len = strlen(ptr);
if (len > 0 && ptr[len - 1] == '\n') {
ptr[len - 1] = '\0';
}
strncpy(value, ptr, size);
found_key = 1;
break;
}
}
}
}
fclose(fp);
if (found_key) {
return 0;
} else {
return -1;
}
}
```
这个函数的参数包括:
- filename:INI 文件名;
- section:要读取的配置项所在的段名;
- key:要读取的配置项的键名;
- value:读取到的配置项的值;
- size:value 的缓冲区大小。
该函数会打开指定的 INI 文件,查找指定的段和键,如果找到则将对应的值读取到 value 缓冲区中,并返回 0,否则返回 -1。
写入 INI 文件:
```c
int write_ini(const char* filename, const char* section, const char* key, const char* value)
{
FILE* fp = fopen(filename, "r");
if (!fp) {
fp = fopen(filename, "w");
if (!fp) {
return -1;
}
} else {
fclose(fp);
}
int ret = 0;
char line[MAX_LINE_LEN];
char* ptr = NULL;
int len = 0;
int in_section = 0;
int found_key = 0;
fp = fopen(filename, "r");
if (!fp) {
return -1;
}
char tmp_filename[MAX_LINE_LEN];
snprintf(tmp_filename, MAX_LINE_LEN, "%s.tmp", filename);
FILE* tmp_fp = fopen(tmp_filename, "w");
if (!tmp_fp) {
fclose(fp);
return -1;
}
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
len = strlen(line);
if (len > 0 && line[len - 1] == '\n') {
line[len - 1] = '\0';
}
if (line[0] == '[' && line[len - 1] == ']') {
ptr = strstr(line, section);
if (ptr != NULL && ptr == line + 1) {
in_section = 1;
} else {
in_section = 0;
}
}
if (in_section) {
ptr = strstr(line, key);
if (ptr != NULL && ptr == line) {
ptr = strchr(line, '=');
if (ptr != NULL) {
fprintf(tmp_fp, "%s=%s\n", key, value);
found_key = 1;
continue;
}
}
}
fprintf(tmp_fp, "%s\n", line);
}
if (!found_key) {
fprintf(tmp_fp, "%s=%s\n", key, value);
if (!in_section) {
fprintf(tmp_fp, "\n[%s]\n", section);
}
}
fclose(fp);
fclose(tmp_fp);
remove(filename);
rename(tmp_filename, filename);
return ret;
}
```
该函数的参数包括:
- filename:INI 文件名;
- section:要写入的配置项所在的段名;
- key:要写入的配置项的键名;
- value:要写入的配置项的值。
该函数会打开指定的 INI 文件,查找指定的段和键,如果找到则更新对应的值,否则在指定的段中添加新的键值对。最后写入更新后的 INI 文件。
需要注意的是,写入 INI 文件时需要先读取原文件,然后使用临时文件进行写入操作,最后再将临时文件重命名为原文件。这是为了避免在写入过程中出现错误导致 INI 文件损坏。
阅读全文