如何用C语言提取ini配置文件指定section及下属对应配置内容
问题解答
1. strcmp匹配section的思路可行性
这个思路本身是可行的,但存在两个容易触发匹配失败的边界问题:
- 不同系统的文件换行符不一致,Windows下换行是
\r\n、Linux下是\n,如果行尾是\r\n,直接用strcmp(x, "[students]\n")会匹配失败 - 如果section标题行前后存在空格(比如行首多了空格的
[students]),也会导致匹配失效
2. 空白行的处理方案
你可以新增两个逻辑规避空白行和匹配异常:
- 新增一个状态标记变量,用来标记当前是否处于目标section的范围内
- 每次读取一行后先做trim处理,去掉行首尾的空格、换行、回车等空白字符:
- 处理后为空的行就是空白行,直接按当前状态决定是否打印即可,不会触发section匹配逻辑
- 仅处理后以
[开头、]结尾的行,才判断是不是目标section
3. 可运行的修改后代码
#include <stdio.h> #include <string.h> #include <ctype.h> // 去掉字符串首尾空白字符的辅助函数 char* trim(char* str) { // 过滤开头空白 while(isspace((unsigned char)*str)) str++; if(*str == 0) return str; // 过滤结尾空白 char* end = str + strlen(str) - 1; while(end > str && isspace((unsigned char)*end)) end--; end[1] = '\0'; return str; } int main() { char x[255]; char trimmed_line[255]; int in_target_section = 0; // 状态标记:是否在目标section范围内 const char* target_section = "students"; FILE* file = fopen("try.ini", "r"); if(!file) { perror("fopen failed"); return 1; } while (fgets(x, sizeof(x), file) != NULL) { strcpy(trimmed_line, x); char* t = trim(trimmed_line); // 判断是否为section行 if(t[0] == '[' && t[strlen(t)-1] == ']') { // 提取section名称,去掉首尾的[] char section_name[255]; strncpy(section_name, t+1, strlen(t)-2); section_name[strlen(t)-2] = '\0'; if(strcmp(section_name, target_section) == 0) { in_target_section = 1; printf("%s", x); // 打印原行保留格式 } else { // 遇到其他section,若之前在目标区间则直接终止遍历 if(in_target_section) break; in_target_section = 0; } continue; } // 非section行,在目标区间内就打印,空白行也会正常输出 if(in_target_section) { printf("%s", x); } } fclose(file); return 0; }
内容的提问来源于stack exchange,提问作者nalyr
相关产品推荐
相关产品推荐

