首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

纯C语言的配置文件读写工程

后端 7.33KB 14 需要积分: 1
立即下载

资源介绍:

c语言下通用的配置文件读写操作代码,可跨平台。
#include #include #include #include #define SIZE_LINE 1024 //每行最大长度 #define SIZE_FILENAME 256 //文件名最大长度 #define min(x, y) (x <= y) ? x : y typedef enum _ELineType_ { LINE_IDLE, //未处理行 LINE_ERROR, //错误行 LINE_EMPTY, //空白行或注释行 LINE_SECTION, //节定义行 LINE_VALUE //值定义行 } ELineType ; static char gFilename[SIZE_FILENAME]; static char *gBuffer; static int gBuflen; //去除串首尾空格,原串被改写 static char *StrStrip(char *s) { size_t size; char *p1, *p2; size = strlen(s); if (!size) return s; p2 = s + size - 1; while ((p2 >= s) && isspace(*p2)) p2 --; *(p2 + 1) = '\0'; p1 = s; while (*p1 && isspace(*p1)) p1 ++; if (s != p1) memmove(s, p1, p2 - p1 + 2); return s; } //不区分大小写比较字符串 static int StriCmp(const char *s1, const char *s2) { int ch1, ch2; do { ch1 = (unsigned char)*(s1++); if ((ch1 >= 'A') && (ch1 <= 'Z')) ch1 += 0x20; ch2 = (unsigned char)*(s2++); if ((ch2 >= 'A') && (ch2 <= 'Z')) ch2 += 0x20; } while ( ch1 && (ch1 == ch2) ); return(ch1 - ch2); } //取一行 //输入:数据区(指针及长度) //输出:行类型、有效内容串(去首尾空格)、注释首、注释尾、下一行首(行尾与下一行首间为换行符) // 有效内容位置为[buf, rem1) static int GetLine(char *buf, int buflen, char *content, char **rem1, char **rem2, char **nextline) { char *cont1, *cont2; int cntblank, cntCR, cntLF; //连续空格、换行符数量 char isQuot1, isQuot2; //引号 int i; char *p; //首先断行断注释,支持如下换行符:\r、\n、\r\n、\n\r cntblank = 0; cntCR = cntLF = 0; isQuot1 = isQuot2 = 0; cont1 = *rem1 = 0; content[0] = 0; for (i = 0, p = buf; i < buflen; i ++, p ++) { if (*p == 0) { p ++; break; } //2个CR或LF,行结束 if (cntCR == 2 || cntLF == 2) { p --; //回溯1 break; } //CR或LF各1个之后任意字符,行结束 if (cntCR + cntLF >= 2) { break; } //CR或LF之后出现其它字符,行结束 if ((cntCR || cntLF) && *p != '\r' && *p != '\n') break; switch (*p) { case '\r': cntCR ++; break; case '\n': cntLF ++; break; case '\'': if (!isQuot2) isQuot1 = 1 - isQuot1; break; case '\"': if (!isQuot1) isQuot2 = 1 - isQuot2; break; case ';': case '#': if (isQuot1 || isQuot2) break; if (*rem1 == NULL) *rem1 = p - cntblank; break; default: if (isspace((unsigned char)*p)) { cntblank ++; } else { cntblank = 0; if ((*rem1 == NULL) && (cont1 == NULL)) cont1 = p; } break; } } *nextline = p; *rem2 = p - cntCR - cntLF; if (*rem1 == NULL) *rem1 = *rem2; cont2 = *rem1 - cntblank; if (cont1 == NULL) { cont1 = cont2; return LINE_EMPTY; } i = (int)(cont2 - cont1); if (i >= SIZE_LINE) return LINE_ERROR; //内容头尾已无空格 memcpy(content, cont1, i); content[i] = 0; if (content[0] == '[' && content[i - 1] == ']') return LINE_SECTION; if (strchr(content, '=') != NULL) return LINE_VALUE; return LINE_ERROR; } //取一节section //输入:节名称 //输出:成功与否、节名称首、节名称尾、节内容首、节内容尾(含换行)、下一节首(节尾与下一节首间为空行或注释行) static int FindSection(const char *section, char **sect1, char **sect2, char **cont1, char **cont2, char **nextsect) { int type; char content[SIZE_LINE]; char *rem1, *rem2, *nextline; char *p; char *empty; int uselen = 0; char found = 0; if (gBuffer == NULL) { return 0; } while (gBuflen - uselen > 0) { p = gBuffer + uselen; type = GetLine(p, gBuflen - uselen, content, &rem1, &rem2, &nextline); uselen += (int)(nextline - p); if (LINE_SECTION == type) { if (found || section == NULL) break; //发现另一section content[strlen(content) - 1] = 0; //去尾部] StrStrip(content + 1); //去首尾空格 if (StriCmp(content + 1, section) == 0) { found = 1; *sect1 = p; *sect2 = rem1; *cont1 = nextline; } empty = nextline; } else if (LINE_VALUE == type) { if (!found && section == NULL) { found = 1; *sect1 = p; *sect2 = p; *cont1 = p; } empty = nextline; } } if (!found) return 0; *cont2 = empty; *nextsect = nextline; return 1; } //从一行取键、值 //输入:内容串(将被改写) //输出:键串、值串 static void GetKeyValue(char *content, char **key, char **value) { char *p; p = strchr(content, '='); *p = 0; StrStrip(content); StrStrip(p + 1); *key = content; *value = p + 1; } //释放ini文件所占资源 void iniFileFree() { if (gBuffer != NULL) { free(gBuffer); gBuffer = 0; gBuflen = 0; } } //加载ini文件至内存 int iniFileLoad(const char *filename) { FILE *file; int len; iniFileFree(); if (strlen(filename) >= sizeof(gFilename)) return 0; strcpy(gFilename, filename); file = fopen(gFilename, "rb"); if (file == NULL) return 0; fseek(file, 0, SEEK_END); len = ftell(file); gBuffer = malloc(len); if (gBuffer == NULL) { fclose(file); return 0; } fseek(file, 0, SEEK_SET); len = fread(gBuffer, 1, len, file); fclose(file); gBuflen = len; return 1; } //读取值原始串 static int iniGetValue(const char *section, const char *key, char *value, int maxlen, const char *defvalue) { int type; char content[SIZE_LINE]; char *rem1, *rem2, *nextline; char *key0, *value0; char *p; int uselen = 0; char found = 0; int len; if (gBuffer == NULL || key == NULL) { if (value != NULL) value[0] = 0; return 0; } while (gBuflen - uselen > 0) { p = gBuffer + uselen; type = GetLine(p, gBuflen - uselen, content, &rem1, &rem2, &nextline); uselen += (int)(nextline - p); if (LINE_SECTION == type) { if (found || section == NULL) break; //发现另一section content[strlen(content) - 1] = 0; //去尾部] StrStrip(content + 1); //去首尾空格 if (StriCmp(content + 1, section) == 0) { found = 1; } } else if (LINE_VALUE == type) { if (!found && section == NULL) { found = 1; } if (!found) continue; GetKeyValue(content, &key0, &value0); if (StriCmp(key0, key) == 0) { len = strlen(value0); if (len == 0) break; //空值视为无效 if (value != NULL) { len = min(len, maxlen - 1); strncpy(value, value0, len); value[len] = 0; } return 1; } } } //未发现键值取缺省 if (value != NULL) { if (defvalue != NULL) { len = min(strlen(defvalue), maxlen - 1); strncpy(value, defvalue, len); value[len] = 0; } else { value[0] = 0; } } return 0; } //获取字符串,不带引号 int iniGetString(const char *section, const char *key, char *value, int maxlen, const char *defvalue) { int ret; int len; ret = iniGetValue(section, key, value, maxlen, defvalue); if (!ret) return ret; //去首尾空格 len = strlen(value); if (value[0] == '\'' && value[len - 1] == '\'') { value[len - 1] = 0; memmove(value, value + 1, len - 1); } else if (value[0] == '\"' && value[len - 1] == '\"') { value[len - 1] = 0; memmove(value, value + 1, len - 1); } return ret; } //获取整数值 int iniGetInt(const char *section, const char *key, int defvalue) { char valstr[64]; if (iniGetValue(section, key, valstr, sizeof(valstr), NULL)) return (int)strtol(valstr, NULL, 0); return defvalue; } //获取浮点数 double iniGetDouble(const char *section, const char *key, double defvalue) { char valstr[64]; if (iniGetValue(section, key, valstr, sizeof(valstr), NULL)) return (int)atof(valstr); return defvalue; } //设置字符串:若value为NULL,则删除该key所在行,包括注释 int iniSetString(const char *section, const char *key, const char *value) { FILE *file; char *sect1, *sect2, *cont1, *cont2, *nextsect; char *p; int len, type; char content[SIZE_LINE]; char *key0, *

资源文件列表:

fileRW.zip 大约有8个文件
  1. fileRW/config.ini 623B
  2. fileRW/inirw.c 10.01KB
  3. fileRW/inirw.h 1.54KB
  4. fileRW/makefile 403B
  5. fileRW/test.cpp 1.14KB
  6. fileRW/test.sln 872B
  7. fileRW/test.vcproj 3.98KB
  8. fileRW/
0评论
提交 加载更多评论
其他资源 2024年系统架构设计师(软考高级)备考资料
《2024年5月系统架构设计师考试-综合知识真题.pdf》、《2024年5月系统架构设计师考试-案例分析真题.pdf》、《2024年5月系统架构设计师考试-论文真题.pdf》电子版 2024年5月系统架构设计师考前模拟卷一、模拟卷二。 《系统架构设计师考试32小时通关-第2版》电子版pdf。 2024年11月系统架构设计师备考全套精讲(综合知识+案例分析+论文写作)视频。 多套2024年11月系统架构设计师备考全套精讲(综合知识+案例分析+论文写作)视频。 ……
2024年系统架构设计师(软考高级)备考资料 2024年系统架构设计师(软考高级)备考资料 2024年系统架构设计师(软考高级)备考资料
项目3的图3-12.zip
项目3的图3-12.zip
项目3的图3-12.zip 项目3的图3-12.zip 项目3的图3-12.zip
C语言例程-文件读写操作代码
c语言文件读写操作代码
植物大战僵尸杂交版2.3.7安装程序+通关存档+使用说明
植物大战僵尸杂交版2.3.7安装程序+通关存档+使用说明
Python谷歌小恐龙--Pygame.zip
Python谷歌小恐龙--Pygame.zip
clickhouse 新版驱动
com.clickhouse.jdbc.ClickHouseDriver 新版驱动
轻量级神经网络+MobileNetV3小模型代码与测试包
本资源包包含 MobileNetV3 小模型 (MobileNetV3_Small) 的预训练权重文件(.pth)、训练过程日志、测试图像以及推理代码。当前版本使用了 300_act3_mobilenetv3_small.pth 模型文件,并通过测试图片(如 car.jpeg)进行推理验证。本资源包不仅适合快速理解 MobileNetV3 网络架构,还可直接用于小模型在轻量级设备上的性能测试。此外,资源中包含标签文件和 FLOPs 计算脚本,帮助用户评估网络的复杂度及运行效率。详细介绍可见博客https://wuxian.blog.csdn.net/article/details/143170942
新建压缩(zipped)文件夹.zip
新建压缩(zipped)文件夹.zip