C语言实现读取配置文件
C语言读取配置文件
C语⾔读取配置⽂件⾃从⼤学学完C之后,就再也没⽤过它了,在⽹上找代码,七拼⼋凑之后,终于成形~~勉强能⽤,不喜勿喷,^_^!int GetValue(const wchar_t *key, wchar_t *value){FILE* fpcfg = NULL;wchar_t var[256], val[256];//key,valuewchar_t linebuf[1024];wchar_t* ptr1 = NULL;wchar_t* ptr2 = NULL;wchar_t* delimiter = NULL;int k = 0;assert(key != NULL && value != NULL);//testConfig.ini中的内容为://key1 = value1//key2 = value2fpcfg = fopen("testConfig.ini", "rt");if(fpcfg == NULL){return -1;}while(fgetws(linebuf, sizeof(linebuf), fpcfg) != NULL){//ignore annotation lineif(linebuf[0]=='#' || linebuf[0]==';'){continue;}//ignore empty lineptr1 = linebuf;while(*ptr1==0x20 || *ptr1=='\t')ptr1++;if(!*ptr1 || *ptr1=='\n'){continue;}//search "="ptr2 = ptr1;while(*ptr2 && *ptr2!='='){ptr2++;}delimiter = *ptr2?ptr2:NULL;//if current line start with "=", continue next lineif(!delimiter || delimiter==ptr1){continue;}//*delimiter = '\0';ptr2 = delimiter-1;//ignore blank before "="while(*ptr2==0x20 || *ptr2=='\t'){ ptr2--;}//check key lengthk = ptr2-ptr1+1;if(k>(int)sizeof(var)-1){//The key name is out of length."continue;}//save key nameptr2 = var;while(k--){*ptr2++ = *ptr1++;}*ptr2 = '\0';//locate value's start point(may be '\0')ptr1 = delimiter+1;//ignore blank after "="while(*ptr1==0x20 || *ptr1=='\t'){ptr1++;}//set ptr2 point to line endptr2 = linebuf;while(*ptr2){ptr2++;}ptr2--;if(*ptr2=='\n'){*ptr2-- = '\0';}//ignore blank line end//if value is empty,ptr2 --> = , ptr1>ptr2while(*ptr2==0x20 || *ptr2=='\t' ){ptr2--;}//check value lengthk = ptr2-ptr1+1;if(k>(int)sizeof(val)-1){//The value is out of length"continue;}//save valueptr2 = val;while(k-->0){*ptr2++ = *ptr1++;}*ptr2 = '\0';if(wcsncmp(var,key, wcslen(var) > wcslen(key) ? wcslen(var) : wcslen(key))==0){ wcsncpy(value,val, wcslen(val));return0;}}fclose(fpcfg);fpcfg = NULL;return -1;}恩,再来个main⽅法测试下:int _tmain(int argc, wchar_t* argv[]){wchar_t value[256] = {0};wchar_t keyParam[256] = L"ip";wchar_t *temp = (wchar_t *)malloc(sizeof(wchar_t) * 256);if(temp != NULL){memset(temp, 0x00, sizeof(wchar_t) * 256);}else{return -1;}if(0 == GetValue(keyParam, temp)){wcsncpy(value, temp, wcslen(temp));wprintf(L"Found: %s\n", value);}else{wprintf(L"Not Found!!\n");}if(temp != NULL){free(temp);temp = NULL;}return0;}View Code好吧,这确实是个很丑陋的版本,仅供⾃⼰留着备⽤。
C语言读取写入ini配置文件的方法实现
C语⾔读取写⼊ini配置⽂件的⽅法实现⽬录⼀、了解什么是INI⽂件?⼆、INI⽂件的格式三、解析上述⽂件四、测试如下⼀、了解什么是INI⽂件?ini ⽂件是Initialization File的缩写,即初始化⽂件,这是⽤来配置应⽤软件以实现不同⽤户的要求。
⼆、INI⽂件的格式INI⽂件由节、键、值组成。
⼀个简单的的INI⽂件例⼦如下:[Setting]INIT_FLAG=0;VOLUME=1;LANGUAGE=1;如上例⼦,[Setting]就是节,=号左边的值是键,=号右边的是值。
三、解析上述⽂件/*ini.h*/#ifndef INI_H#define INI_H#include <stdio.h>#include <string.h>int GetIniKeyString(char *title,char *key,char *filename,char *buf);int PutIniKeyString(char *title,char *key,char *val,char *filename);#endif /*INI_H*//*ini.c*/#include <stdio.h>#include <string.h>/** 函数名: GetIniKeyString* ⼊⼝参数: title* 配置⽂件中⼀组数据的标识* key* 这组数据中要读出的值的标识* filename* 要读取的⽂件路径* 返回值:找到需要查的值则返回正确结果 0* 否则返回-1*/int GetIniKeyString(char *title,char *key,char *filename,char *buf){FILE *fp;int flag = 0;char sTitle[64], *wTmp;char sLine[1024];sprintf(sTitle, "[%s]", title);if(NULL == (fp = fopen(filename, "r"))) {perror("fopen");return -1;}while (NULL != fgets(sLine, 1024, fp)) {// 这是注释⾏if (0 == strncmp("//", sLine, 2)) continue;if ('#' == sLine[0]) continue;wTmp = strchr(sLine, '=');if ((NULL != wTmp) && (1 == flag)) {if (0 == strncmp(key, sLine, strlen(key))) { // 长度依⽂件读取的为准sLine[strlen(sLine) - 1] = '\0';fclose(fp);while(*(wTmp + 1) == ' '){wTmp++;}strcpy(buf,wTmp + 1);return 0;}} else {if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依⽂件读取的为准flag = 1; // 找到标题位置}}}fclose(fp);return -1;}/** 函数名: PutIniKeyString* ⼊⼝参数: title* 配置⽂件中⼀组数据的标识* key* 这组数据中要读出的值的标识* val* 更改后的值* filename* 要读取的⽂件路径* 返回值:成功返回 0* 否则返回 -1*/int PutIniKeyString(char *title,char *key,char *val,char *filename){FILE *fpr, *fpw;int flag = 0;char sLine[1024], sTitle[32], *wTmp;sprintf(sTitle, "[%s]", title);if (NULL == (fpr = fopen(filename, "r")))return -1;// 读取原⽂件sprintf(sLine, "%s.tmp", filename);if (NULL == (fpw = fopen(sLine, "w")))return -1;// 写⼊临时⽂件while (NULL != fgets(sLine, 1024, fpr)) {if (2 != flag) { // 如果找到要修改的那⼀⾏,则不会执⾏内部的操作wTmp = strchr(sLine, '=');if ((NULL != wTmp) && (1 == flag)) {if (0 == strncmp(key, sLine, strlen(key))) { // 长度依⽂件读取的为准flag = 2;// 更改值,⽅便写⼊⽂件sprintf(wTmp + 1, " %s\n", val);}} else {if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依⽂件读取的为准flag = 1; // 找到标题位置}}}fputs(sLine, fpw); // 写⼊临时⽂件}fclose(fpr);fclose(fpw);sprintf(sLine, "%s.tmp", filename);return rename(sLine, filename);// 将临时⽂件更新到原⽂件}上述两个函数是简单的解析函数,因为ini⽂件有很多种解析⽅式,根据不同的需求解析也不同所以要进⾏修改⽐如我的注释符号是 “ ;”,所以我需要修改并且根据实际功能需求也可以进⾏进⼀步的封装四、测试如下ini样本⽂件/*test.ini*/[city]beijing = hello-beijingshanghai = hello-shanghai#information[study]highschool = xxxxuniversity = yyyytest.c程序/*test.c*/#include "ini.h"#include <stdio.h>int main(int argc, char const *argv[]){char buff[100];int ret;ret = GetIniKeyString("city","beijing","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);ret = GetIniKeyString("study","highschool","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);ret = PutIniKeyString("study","highschool","zzzz","./test.ini");printf("put ret:%d\n",ret);ret = GetIniKeyString("study","highschool","./test.ini",buff);printf("ret:%d,%s\n",ret,buff);return 0;}结果如下:ret:0,hello-beijingret:0,xxxxput ret:0ret:0,zzzz相应的test.ini的study段highschool项变成了zzzz.这⾥还要注意,section使⽤中⽂字符可能会⽆法识别!到此这篇关于C语⾔读取写⼊ini配置⽂件的⽅法实现的⽂章就介绍到这了,更多相关C语⾔读取写⼊ini 内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
c语言读写配置文件
c语⾔读写配置⽂件配置⽂件的格式如下:key1 = value1key2 = value2中间及前后可以有多个空格思路分析: 读写配置⽂件可以分成底层API接⼝和调⽤API的界⾯⼆个模块,⼆个模块间耦合度要尽量低,底层封装的API要尽量好⽤。
不要让⼈家写⽂件的时候还需要⾃⼰去判断配置项是否已经存在,这些功能底层API要做完善。
⼀接⼝设计 既然是读写,提供给外部⼀个读取的接⼝和⼀个写⼊的接⼝就可以了。
要让⼆个接⼝⽅便好⽤int writeCFG(const char *filename/*in*/, const char *key/*in*/, const char *value/*in*/);//写⼊配置⽂件void readCFG(const char *filename/*in*/, const char *key/*in*/, const char **value/*out*/);//读取配置⽂件⼆框架搭建 ReadAndWrite.h 函数原型 void trim(char *strIn, char *strOut);//去除字符串前⾯和后⾯的空格void getValue(char * keyAndValue, char * key, char * value);//根据key得到valueint writeCFG(const char *filename/*in*/, const char *key/*in*/, const char *value/*in*/);//写⼊配置⽂件void readCFG(const char *filename/*in*/, const char *key/*in*/, const char **value/*out*/);//读取配置⽂件三代码实现 ReadAndWrite.c 函数实现void trim(char *strIn, char *strOut){char *start, *end, *temp;//定义去除空格后字符串的头尾指针和遍历指针temp = strIn;while (*temp == ''){++temp;}start = temp; //求得头指针temp = strIn + strlen(strIn) - 1; //得到原字符串最后⼀个字符的指针(不是'\0')while (*temp == ''){--temp;}end = temp; //求得尾指针for(strIn = start; strIn <= end; ){*strOut++ = *strIn++;}*strOut = '\0';}void getValue(char * keyAndValue, char * key, char * value){char *p = keyAndValue;p = strstr(keyAndValue, key);//找到key的位置,指针if(p == NULL){printf("没有key %s\n", key);return ;}p += strlen(key);//指针后移到key后⾯trim(p, value);p = strstr(value, "=");//找等号的位置if(p == NULL){printf("没有找到=\n");return;}p+= strlen("=");//指针后移到等号后⾯trim(p, value);//删除字符串前后的空格}int writeCFG(const char *filename/*in*/, const char *key/*in*/, const char *value/*in*/){ FILE *pf = NULL;char ftemp[flen] = {0}, fline[1024] = {0}, *fp; //⽂件缓存数组long fsize = 0;int reg = 0;int exit = 0;int i = 0; int flen = 8*1024;pf = fopen(filename, "r+");if(pf == NULL){pf = fopen(filename, "w+");}//获得⽂件⼤⼩fseek(pf, 0, SEEK_END); // 将⽂件指针pf指向末尾fsize = ftell(pf);//获取⽂件开头到pf的长度if(fsize > flen){printf("⽂件不能超过8k\n");reg = -1;goto end;}fseek(pf, 0, SEEK_SET); //将⽂件指针指向开头//⼀⾏⼀⾏的读,如果存在key则修改value存到缓存数组中while(!feof(pf)){//未到⽂件结尾fgets(fline, 1024, pf);if(strstr(fline, key) != NULL && exit == 1)strcpy(fline, "");if(strstr(fline, key) != NULL && exit == 0){ //判断key是否存在exit = 1;sprintf(fline,"%s = %s\n", key, value);}printf("fline = %s\n", fline);strcat(ftemp, fline);}if(exit != 1){//如果不存在则把key value写⼊到最后⼀⾏sprintf(fline,"%s = %s\n", key, value);strcat(ftemp, fline);}if(pf != NULL){fclose(pf);pf = fopen(filename, "w+");fp = (char *)malloc(sizeof(char) * strlen(ftemp) + 1);strcpy(fp, ftemp);fp[strlen(fp) - 1] = EOF;fputs(fp, pf);if(fp != NULL){free(fp);fp = NULL;}fclose(pf);}end :if(pf != NULL)fclose(pf);//重新创建⼀个以filename命名的⽂件return reg;}void readCFG(const char *filename/*in*/, const char *key/*in*/, const char **value/*out*/){ FILE *pf = NULL;char line[1024] = {0}, vtemp[1024] = {0};pf = fopen(filename, "r"); //以只读⽅式打开while(!feof(pf)){fgets(line, 1024, pf);getValue(line, key, vtemp);if(strlen(vtemp) != 0)break;}if(strlen(vtemp) != 0){*value = (char *)malloc(sizeof(char) * strlen(vtemp) + 1);strcpy(*value, vtemp);}else*value = NULL;if(pf != NULL)fclose(pf);}测试界⾯代码:#define filename "c:/cfg.ini"void menu(){printf("===========================\n");printf("1 写⼊配置⽂件\n");printf("2 读取配置⽂件\n");printf("0 退出程序");printf("===========================\n");}int tWrite(){char key[1024] = {0}, value[1024] = {0};printf("请输⼊key:");scanf("%s", key);printf("请输⼊value:");scanf("%s", value);printf("\n您输⼊的是:%s = %s\n", key, value);return writeCFG(filename/*in*/,key/*in*/,value/*in*/);}void tRead(){char key[1024] = {0}, *value;printf("请输⼊key:");scanf("%s", key);readCFG(filename/*in*/,key/*in*/, &value/*out*/);if(value == NULL){printf("没有key\n");return ;}printf("\nvalue = %s\n", value);if(value != NULL){free(value);value = NULL;}}int main(){int choose;while(1){choose = 0;menu();printf("请输⼊选择:");scanf("%d", &choose);switch(choose){case1:if(tWrite() == -1)return -1;break;case2:tRead();break;case0:return0;default:return0;}}system("pause"); return0;}。
linux下C程序--读取配置文件--ini格式
szLine[i++] = rtnval; } if(rtnval == '\n') {
szLine[--i] = '\n'; i = 0;
1/3
tmp = strchr(szLine, '='); if((tmp != NULL) && (flag == 1)) {
if(strstr(szLine, key)Байду номын сангаас!= NULL) {
//comment if('#' == szLine[0]); else if('/' == szLine[0] && '/' == szLine[1]); else {
//local key position strcpy(tmpstr, tmp+1); fclose(fp); return tmpstr; } } } else { strcpy(tmpstr, "["); strcat(tmpstr, title); strcat(tmpstr, "]"); if(strncmp(tmpstr, szLine, strlen(tmpstr)) == 0) { //encounter title flag = 1; } } } } fclose(fp); return ""; } int get_int_from_ini(char *title, char *key, char *filename) { return atoi(get_string_from_ini(title, key, filename)); } int main(int argc, char **argv) { char name[1024]; int age = 0; memset(name, 0, sizeof(name)); age = get_int_from_ini("test", "age", argv[1]); strcpy(name, get_string_from_ini("test", "name", argv[1])); //puts(name); printf("%s", name); printf("age = %d\n", age); }
C语言读取INI配置文件
C语言读取INI配置文件Ini.h#pragma once#include"afxTempl.h"class DLLPORT CIni{private:CString m_strFileName;public:CIni(CString strFileName) :m_strFileName(strFileName){}public://一般性操作:BOOL SetFileName(LPCTSTR lpFileName); //设置文件名CString GetFileName(void); //获得文件名BOOL SetValue(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue, bool bCreate = true); //设置键值,bCreate是指段名及键名未存在时,是否创建。
CString GetValue(LPCTSTR lpSection, LPCTSTR lpKey); //得到键值.BOOL DelSection(LPCTSTR strSection); //删除段名BOOL DelKey(LPCTSTR lpSection, LPCTSTR lpKey); //删除键名public://高级操作:int GetSections(CStringArray& arrSection); //枚举出全部的段名int GetKeyValues(CStringArray& arrKey, CStringArray& arrValue, LPCTSTR lpSection); //枚举出一段内的全部键名及值BOOL DelAllSections();};/*使用方法:CIni ini("c:\\a.ini");int n;/*获得值TRACE("%s",ini.GetValue("段1","键1"));*//*添加值ini.SetValue("自定义段","键1","值");ini.SetValue("自定义段2","键1","值",false);*//*枚举全部段名CStringArray arrSection;n=ini.GetSections(arrSection);for(int i=0;i<n;i++)TRACE("%s\n",arrSection[i]);*//*枚举全部键名及值CStringArray arrKey,arrValue;n=ini.GetKeyValues(arrKey,arrValue,"段1");for(int i=0;i<n;i++)TRACE("键:%s\n值:%s\n",arrKey[i],arrValue[i]); *//*删除键值ini.DelKey("段1","键1");*//*删除段ini.DelSection("段1");*//*删除全部ini.DelAllSections();*/Ini.cpp#include"StdAfx.h"#include"Ini.h"#define MAX_ALLSECTIONS 2048 //全部的段名#define MAX_SECTION 260 //一个段名长度#define MAX_ALLKEYS 6000 //全部的键名#define MAX_KEY 260 //一个键名长度BOOL CIni::SetFileName(LPCTSTR lpFileName){CFile file;CFileStatus status;if (!file.GetStatus(lpFileName, status))return TRUE;m_strFileName = lpFileName;return FALSE;}CString CIni::GetFileName(void){return m_strFileName;}BOOL CIni::SetValue(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue, bool bCreate) {TCHAR lpTemp[MAX_PATH] = { 0 };//以下if语句表示如果设置bCreate为false时,当没有这个键名时则返回TRUE(表示出错)//!*&*none-value*&!* 这是个垃圾字符没有特别意义,这样乱写是防止凑巧相同。
c语言读取文件内容
c语言读取文件内容C语言读取文件内容。
在C语言中,我们经常需要读取文件的内容进行处理,比如配置文件、日志文件等。
下面我们就来学习一下如何在C语言中读取文件内容。
首先,我们需要使用C语言中的文件操作函数来打开文件。
我们可以使用fopen函数来打开一个文件,语法如下:```c。
FILE fopen(const char filename, const char mode);```。
其中,filename是要打开的文件名,mode是打开文件的模式,比如"r"表示只读,"w"表示只写,"a"表示追加写入等。
fopen函数会返回一个指向FILE类型的指针,我们可以通过这个指针来操作文件。
接下来,我们可以使用fgets函数来逐行读取文件内容,语法如下:```c。
char fgets(char str, int n, FILE stream);```。
其中,str是一个指向字符数组的指针,n是要读取的最大字符数,stream是指向FILE类型的指针。
fgets函数会读取文件中的一行内容,并将其存储到str指向的字符数组中。
另外,我们也可以使用fscanf函数来按照指定的格式来读取文件内容,语法如下:```c。
int fscanf(FILE stream, const char format, ...);```。
fscanf函数可以按照指定的格式从文件中读取内容,并将其存储到对应的变量中。
比如,我们可以使用%f来读取一个浮点数,%d来读取一个整数等。
在读取文件内容之后,我们需要使用fclose函数来关闭文件,以释放资源,语法如下:```c。
int fclose(FILE stream);```。
fclose函数会关闭由stream指向的文件,并释放相关的资源。
总结一下,我们可以通过fopen函数打开文件,然后使用fgets或者fscanf函数来读取文件内容,最后使用fclose函数关闭文件。
C读取配置文件
C读取配置⽂件#ifndef __CFG_OP_H__#define __CFG_OP_H__#ifdef __cplusplusextern"C" {#endif//获取配置项int GetCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in out*/, int * pValueLen /*out*/);//写配置项int WriteCfgItem(char *pFileName /*in*/, char *pItemName /*in*/, char *pItemValue/*in*/, int itemValueLen /*in*/); #ifdef __cplusplus}#endif#endif#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <string.h>#include <stdio.h>#define MaxLine 2048//获取配置项int GetCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in out*/, int * pValueLen /*out*/){int ret = 0;FILE *fp = NULL;char *pTmp = NULL, *pEnd = NULL, *pBegin = NULL;char lineBuf[MaxLine];fp = fopen(pFileName, "r");//读的⽅式打开⽂件if (fp == NULL){ret = -1;return ret;}while (!feof(fp))//没有到达⽂件末尾{memset(lineBuf, 0, sizeof(lineBuf));//清空内存空间//fgets(_Out_z_cap_(_MaxCount) char * _Buf, _In_ int _MaxCount, _Inout_ FILE * _File);fgets(lineBuf, MaxLine, fp);//从⽂件中⼀⾏⼀⾏的获取数据//printf("lineBuf:%s ",lineBuf );pTmp = strchr(lineBuf, '='); //有没有等号if (pTmp == NULL) //没有=号{continue;}pTmp = strstr(lineBuf, pKey);//所在⾏是不是有keyif (pTmp == NULL) //判断key是不是在{continue;}pTmp = pTmp + strlen(pKey); //mykey1 = myvalude11111111 ==> "= myvalude1111111"pTmp = strchr(pTmp, '=');if (pTmp == NULL) //判断key是不是在 //所在⾏是不是有key{continue;}pTmp = pTmp + 1;////printf("pTmp:%s ", pTmp);//获取value 起点while (1){if (*pTmp == ''){pTmp ++ ;}else{pBegin = pTmp;if (*pBegin == '\n'){//没有配置value//printf("配置项:%s 没有配置value \n", pKey);goto End;}break;}}//获取valude结束点while (1){if ((*pTmp == '' || *pTmp == '\n')){break;}else{pTmp ++;}}pEnd = pTmp;//赋值*pValueLen = pEnd-pBegin;memcpy(pValue, pBegin, pEnd-pBegin);}End:if (fp == NULL){fclose(fp);}return0;}//写配置项//实现流程//循环读每⼀⾏,检查key配置项是否存在若存在修改对应value值//若不存在,在⽂件末尾添加 "key = value"//难点:如何修改⽂件流中的值int WriteCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in*/, int ValueLen /*in*/){int rv = 0, iTag = 0, length = 0;FILE *fp = NULL;char lineBuf[MaxLine];char *pTmp = NULL, *pBegin = NULL, *pEnd = NULL;char filebuf[1024*8] = {0};if (pFileName==NULL || pKey==NULL || pValue==NULL){rv = -1;printf("SetCfgItem() err. param err \n");goto End;}fp = fopen(pFileName, "r+");if (fp == NULL){rv = -2;printf("fopen() err. \n");//goto End;}if (fp == NULL)//⽂件不存在就去创建⼀个⽂件{fp = fopen(pFileName, "w+t");if (fp == NULL){rv = -3;printf("fopen() err. \n");goto End;}}fseek(fp, 0L, SEEK_END); //刚开始⽂件指针指向的是⽂件的开头,把⽂件指针从0位置开始,移动到⽂件末尾//获取⽂件长度;length = ftell(fp);//fp指向了⽂件的末尾fseek(fp, 0L, SEEK_SET);//再把⽂件指针指向⽂件的头部if (length > 1024*8) //⽂件不能超过8K,不然内存不⽀持{rv = -3;printf("⽂件超过1024*8, nunsupport");goto End;}while (!feof(fp)){//读每⼀⾏memset(lineBuf, 0, sizeof(lineBuf));pTmp = fgets(lineBuf, MaxLine, fp);if (pTmp == NULL){break;}//key关键字是否在本⾏pTmp = strstr(lineBuf, pKey);if (pTmp == NULL) //key关键字不在本⾏, copy到filebuf中{strcat(filebuf, lineBuf);//复制到filebuf中去continue;}else//key关键在在本⾏中,替换旧的⾏,再copy到filebuf中{sprintf(lineBuf, "%s = %s\n", pKey, pValue);strcat(filebuf, lineBuf);//若存在keyiTag = 1;}}//所有的⾏中若key关键字,不存在追加if (iTag == 0){fprintf(fp, "%s = %s\n", pKey, pValue);//格式化输⼊}else//若key关键字,存在,则重新创建⽂件{if (fp != NULL){fclose(fp); //关闭⽂件fp = NULL; //避免野指针}fp = fopen(pFileName, "w+t"); //重新建⽴⼀个⽂件if (fp == NULL){rv = -4;printf("fopen() err. \n");goto End;}fputs(filebuf, fp);//把所有⽂件缓冲的内容输⼊到fp,覆盖原来的⽂件//fwrite(filebuf, sizeof(char), strlen(filebuf), fp);}End:if (fp != NULL){fclose(fp);}return rv;}#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <string.h>#include <stdio.h>#include "cfg_op.h"#define CFGNAME "c:/mycfg.ini"void mymenu(){printf("=============================\n");printf("1 测试写配置⽂件\n");printf("2 测试读配置⽂件\n");printf("0 退出\n");printf("=============================\n");}//获取配置项int TGetCfg(){int ret = 0;//读配置项char name[1024] = {0};char valude[1024] = {0};int vlen = 0;printf("\n请键⼊key:");scanf("%s", name);ret = GetCfgItem(CFGNAME /*in*/, name /*in*/, valude/*in*/, &vlen);if (ret != 0){printf("func WriteCfgItem err:%d \n", ret);return ret;}printf("valude:%s \n", valude);}//写配置项int TWriteCfg(){int ret = 0;//写配置项char name[1024] = {0};char valude[1024] = {0};printf("\n请键⼊key:");scanf("%s", name);printf("\n请键⼊valude:");scanf("%s", valude);ret = WriteCfgItem(CFGNAME /*in*/, name /*in*/, valude/*in*/,strlen(valude) /*in*/); if (ret != 0){printf("func WriteCfgItem err:%d \n", ret);return ret;}printf("你的输⼊是:%s = %s \n", name , valude);return ret;}void main(){int choice;for (;;){//显⽰⼀个菜单mymenu();scanf("%d", &choice);switch (choice){case1: //写配置项TWriteCfg();break;case2:TGetCfg(); //读配置项break;case0:exit(0);default:;exit(0);}}printf("hello...\n");system("pause");return ;}。
c读取配置文件的方法
c读取配置文件的方法在C语言中,读取配置文件是一项非常常见的任务。
配置文件通常包含了程序运行时需要的各种参数和设置,因此读取配置文件是程序启动时必须完成的任务之一。
本文将介绍如何使用C语言读取配置文件。
我们需要了解配置文件的格式。
配置文件通常是一个文本文件,其中包含了一系列的键值对。
每个键值对由一个键和一个值组成,中间用等号连接。
例如:```key1=value1key2=value2key3=value3```在C语言中,我们可以使用标准库中的fopen函数打开配置文件。
例如:```cFILE *fp = fopen("config.ini", "r");```这里我们打开了一个名为config.ini的文件,并以只读模式打开。
接下来,我们可以使用标准库中的fgets函数逐行读取配置文件。
例如:```cchar line[256];while (fgets(line, sizeof(line), fp)) {// 处理每一行}```这里我们定义了一个长度为256的字符数组line,然后使用fgets 函数逐行读取配置文件。
fgets函数的第一个参数是一个字符数组,用于存储读取到的行;第二个参数是字符数组的长度;第三个参数是文件指针,用于指定要读取的文件。
接下来,我们需要解析每一行的键值对。
我们可以使用标准库中的strtok函数将每一行按照等号分割成键和值。
例如:```cchar *key = strtok(line, "=");char *value = strtok(NULL, "=");```这里我们使用strtok函数将line按照等号分割成两个部分,分别是键和值。
strtok函数的第一个参数是要分割的字符串;第二个参数是分割符,这里是等号。
strtok函数会返回分割后的第一个部分,我们可以使用NULL作为第一个参数来获取分割后的第二个部分。
vc读写配置文件方法
vc 用函数读写INI配置文件ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。
ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。
读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。
一、向ini文件中写入信息的函数1. 把信息写入系统的win.ini文件BOOL WriteProfileString(LPCTSTR lpAppName, // 节的名字,是一个以0结束的字符串LPCTSTR lpKeyName, // 键的名字,是一个以0结束的字符串。
若为NULL,则删除整个节LPCTSTR lpString // 键的值,是一个以0结束的字符串。
若为NULL,则删除对应的键)2. 把信息写入自己定义的.ini文件BOOL WritePrivateProfileString(LPCTSTR lpAppName, // 同上LPCTSTR lpKeyName, // 同上LPCTSTR lpString, // 同上LPCTSTR lpFileName // 要写入的文件的文件名。
若该ini文件与程序在同一个目录下,也可使用相对//路径,否则需要给出绝度路径。
)如:::WriteProfileString("Test","id","xym");//在win.ini中创建一个Test节,并在该节中创建一个键id,其值为xym::WritePrivateProfileString("Test","id","xym","d:\\vc\\Ex1\\ex1.ini" );//在Ex1目录下的ex1.ini中创建一个Test节,并在该节中创建一个键id,其值为xym//若Ex1.ini文件与读写该文件的程序在同一个目录下,则上面语句也可写为:::WritePrivateProfileString("Test","id","xym",".\\ex1.ini");需要注意的是,C系列的语言中,转义字符'\\'表示反斜线'\'。
c读取配置文件的方法
c读取配置文件的方法在C语言中读取配置文件是非常常见的操作,它可以方便地管理程序的一些参数和选项,让程序更加灵活和易于维护。
下面是一些常见的方法:1. 使用标准库函数fopen和fscanf这是最常见的方法之一,使用标准库函数fopen和fscanf来逐行读取配置文件中的内容。
具体实现步骤如下:a. 使用fopen打开配置文件,获取文件指针。
b. 使用fscanf读取每一行的内容,根据具体的配置格式进行解析。
c. 关闭文件指针。
示例代码:FILE *fp;char buf[1024];int value;fp = fopen('config.ini', 'r');if (fp == NULL){printf('Cannot open config file.');return -1;}while (fgets(buf, sizeof(buf), fp) != NULL){if (sscanf(buf, 'key=%d', &value) == 1){// 解析成功,使用读取到的值进行后续操作printf('value=%d', value);}}fclose(fp);2. 使用ini配置文件解析库ini配置文件解析库是一个专门用来解析ini配置文件的库,它能够快速、简单地读取和修改ini文件中的配置项。
具体实现步骤如下:a. 下载并安装ini解析库。
b. 使用ini_parse函数读取配置文件。
c. 使用ini_get函数获取配置项的值。
示例代码:#include 'ini.h'int handler(void* user, const char* section, const char* name,const char* value)if (strcmp(section, 'config') == 0 && strcmp(name, 'key') == 0){// 获取配置项的值int* pvalue = (int*)user;*pvalue = atoi(value);}return 1;}int main(){int value;if (ini_parse('config.ini', handler, &value) < 0){printf('Cannot open config file.');return -1;}printf('value=%d', value);return 0;3. 使用XML配置文件解析库XML配置文件解析库是一个专门用来解析XML格式的配置文件的库,它能够解析复杂的XML文件,并且提供了灵活的配置项操作方式。
linux下C程序--读取配置文件--ini格式
ini格式
在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容, 但是在Linux平台上就一筹莫展了。 为了解决该问题,打算用C来读取.ini,就可以不受平台的限制了。 配置文件Config.ini [test] name=elikang age=12
break; } else {
szLine[i++] = rtnval; } if(rtnval == '\n') {
szLine[--i] = '\n'; i = 0;
1/3
tmp = strchr(szLine, '='); if((tmp != NULL) && (flag == 1)) {
if(strstr(szLine, key) != NULL) {
//comment if('#' == szLine[0]); else if('/' == szLine[0] && '/' == szLine[1]); else {
//local key position strcpy(tmpstr, tmp+1); fclose(fp); return tmpstr; } } } else { strcpy(tmpstr, "["); strcat(tmpstr, title); strcat(tmpstr, "]"); if(strncmp(tmpstr, szLine, strlen(tmpstr)) == 0) { //encounter title flag = 1; } } } } fclose(fp); return ""; } int get_int_from_ini(char *title, char *key, char *filename) { return atoi(get_string_from_ini(title, key, filename)); } int main(int argc, char **argv) { char name[1024]; int age = 0; memset(name, 0, sizeof(name)); age = get_int_from_ini("test", "age", argv[1]); strcpy(name, get_string_from_ini("test", "name", argv[1])); //puts(name); printf("%s", name); printf("age = %d\n", age); }
C#中读写配置参数文件(利用Windows的API)
C#中读写配置参数⽂件(利⽤Windows的API)读配置⽂件与写配置⽂件的核⼼代码如下:1 [DllImport("kernel32")]2// 读配置⽂件⽅法的6个参数:所在的分区(section)、键值、初始缺省值、 StringBuilder、参数长度上限、配置⽂件路径3private static extern int GetPrivateProfileString(string section, string key, string deVal, StringBuilder retVal,4int size, string filePath);56 [DllImport("kernel32")]7// 写配置⽂件⽅法的4个参数:所在的分区(section)、键值、参数值、配置⽂件路径8private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);910public static void SetValue(string section, string key, string value)11 {12//获得当前路径,当前是在Debug路径下13string strPath = Environment.CurrentDirectory + "\\system.ini";14 WritePrivateProfileString(section, key, value, strPath);15 }1617public static string GetValue(string section, string key)18 {19 StringBuilder sb = new StringBuilder(255);20string strPath = Environment.CurrentDirectory + "\\system.ini";21//最好初始缺省值设置为⾮空,因为如果配置⽂件不存在,取不到值,程序也不会报错22 GetPrivateProfileString(section, key, "配置⽂件不存在,未取到参数", sb, 255, strPath);23return sb.ToString();2425 }262728【应⽤举例】功能说明:程序加载时,创建配置⽂件并往⾥⾯写⼊波特率参数。
c语言读写配置文件(多示例)
1、
/************************************************************************/
/* make0000@ */
/************************************************************************/
{
int flag=0;
FILE* file;
file=fopen(filename,"a");
try
{
if(file==NULL)
{
flag=1;
throw(flag);
}
fprintf(file,"$%s=%s\n",key,value);
}
catch(Exception)
{
printf("Can't write file %s",filename);
#define GetError() errno
dllexport void sig_usr(int);
dllexport char* getTime();
}
#else
#define dllexport __declspec(dllexport)
jmp_buf Jmp_Buf;
int E;
#define Exception 0x00000
try
{
if(file==NULL)
{
flag=1;
throw(flag);
}
else
{
while(fgets(buffer,SIZE,file)!=NULL)
{
VC下读取.ini配置文件
在Visua l C++ 6.0下对Wind ows配置设置文件的存取访问方法的详细介绍。
一、引言不论是对于程序开发人员还是软件应用人员,一定不会对扩展名为"ini"的文件感到陌生,不仅Windo ws操作系统将大名鼎鼎的win.ini作为记录当前系统状态,并根据其记录内容对系统进行配置的一种便捷的方法,而且众多的应用软件也广泛地使用该类型的配置文件来对软件进行记录、配置。
本文就针对配置设置文件的使用展开讨论,以期能为软件状态的记录与设置寻求一种方便简洁的实现方法。
二、配置设置文件概述配置设置文件是Wi ndows操作系统下的一种特殊化的ASC II文件,以"ini"为文件扩展名。
该文件也被称做是初始化文件(ini tiali zatio n fil e)和概要文件(pr ofile),通常应用程序可以拥有自己的配置设置文件来存储自己的状态信息,一般来说私有的配置设置文件比较小,可以减少程序在初始化时读取配置文件时的信息量,从而可以提高程序的启动速度、提高应用程序和系统的性能。
但如待存取的信息涉及到Windo ws系统环境或是其他的应用程序时才必须在Windo ws系统的配置文件w in.in i中记录并在访问的同时发送出消息WM_W ININI CHANG E给所有的顶层窗口,通知其他的程序系统的配置文件已做了更改。
但由于wi n.ini中不仅记录了系统的有关信息,也存储着许多其他应用软件的一些配置数据,所以访问的数据量要远比私有的配置文件大的多。
配置文件里的信息之所以能为系统和众多的软件所读取并识别,是由于其内部对数据的存取采用了预先约定好的"项-值对(en try-v aluepairs)"存储结构来对待存取的数据进行分门别类地进行条理清晰的存储。
vc中读取配置文件的方法[资料]
在Visual C++ 6.0下对Windows配置设置文件的存取访问方法的详细介绍。
一、引言0不论是对于程序开发人员还是软件应用人员,一定不会对扩展名为"ini"的文件感到陌生,不仅Windows操作系统将大名鼎鼎的win.ini作为记录当前系统状态,并根据其记录内容对系统进行配置的一种便捷的方法,而且众多的应用软件也广泛地使用该类型的配置文件来对软件进行记录、配置。
本文就针对配置设置文件的使用展开讨论,以期能为软件状态的记录与设置寻求一种方便简洁的实现方法。
0二、配置设置文件概述0配置设置文件是Windows操作系统下的一种特殊化的ASCII文件,以"ini"为文件扩展名。
该文件也被称做是初始化文件(initialization file)和概要文件(profile),通常应用程序可以拥有自己的配置设置文件来存储自己的状态信息,一般来说私有的配置设置文件比较小,可以减少程序在初始化时读取配置文件时的信息量,从而可以提高程序的启动速度、提高应用程序和系统的性能。
但如待存取的信息涉及到Windows 系统环境或是其他的应用程序时才必须在Windows系统的配置文件win.ini中记录并在访问的同时发送出消息WM_WININICHANGE给所有的顶层窗口,通知其他的程序系统的配置文件已做了更改。
但由于win.ini中不仅记录了系统的有关信息,也存储着许多其他应用软件的一些配置数据,所以访问的数据量要远比私有的配置文件大的多。
0配置文件里的信息之所以能为系统和众多的软件所读取并识别,是由于其内部对数据的存取采用了预先约定好的"项-值对(entry-value pairs)"存储结构来对待存取的数据进行分门别类地进行条理清晰的存储。
我们可以打开系统目录下的win.ini文件:0[windows]load=run=NullPort=None0[Desktop]WallpaperStyle=2Pattern=(无)0[intl]s2359=PMiCountry=86 0可见,配置文件把信息分成若干"节",节标题放在方括号中,如[Desktop]就是Desktop节,在一个节内包含了一些与之相关相近的"项",并通过等号对其进行赋值。
用C读取INI配置文件
⽤C读取INI配置⽂件/chexlong/article/details/6818017#define CONF_FILE_PATH "Config.ini"#include <string.h>#ifdef WIN32#include <Windows.h>#include <stdio.h>#else#define MAX_PATH 260#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#endifchar g_szConfigPath[MAX_PATH];//获取当前程序⽬录int GetCurrentPath(char buf[],char *pFileName){#ifdef WIN32GetModuleFileName(NULL,buf,MAX_PATH);#elsechar pidfile[64];int bytes;int fd;sprintf(pidfile, "/proc/%d/cmdline", getpid());fd = open(pidfile, O_RDONLY, 0);bytes = read(fd, buf, 256);close(fd);buf[MAX_PATH] = '\0';#endifchar * p = &buf[strlen(buf)];do{*p = '\0';p--;#ifdef WIN32} while( '\\' != *p );#else} while( '/' != *p );#endifp++;//配置⽂件⽬录memcpy(p,pFileName,strlen(pFileName));return 0;}//从INI⽂件读取字符串类型数据char *GetIniKeyString(char *title,char *key,char *filename){FILE *fp;char szLine[1024];static char tmpstr[1024];int rtnval;int i = 0;int flag = 0;char *tmp;if((fp = fopen(filename, "r")) == NULL){printf("have no such file \n");return "";}while(!feof(fp)){rtnval = fgetc(fp);if(rtnval == EOF){break;}else{szLine[i++] = rtnval;}if(rtnval == '\n'){#ifndef WIN32i--;#endifszLine[--i] = '\0';i = 0;tmp = strchr(szLine, '=');if(( tmp != NULL )&&(flag == 1)){if(strstr(szLine,key)!=NULL){//注释⾏if ('#' == szLine[0]){}else if ( '\/' == szLine[0] && '\/' == szLine[1] ){}else{//找打key对应变量strcpy(tmpstr,tmp+1);fclose(fp);return tmpstr;}}}else{strcpy(tmpstr,"[");strcat(tmpstr,title);strcat(tmpstr,"]");if( strncmp(tmpstr,szLine,strlen(tmpstr)) == 0 ){//找到titleflag = 1;}}}}fclose(fp);return "";}//从INI⽂件读取整类型数据int GetIniKeyInt(char *title,char *key,char *filename) {return atoi(GetIniKeyString(title,key,filename));}int main(int argc, char* argv[]){char buf[MAX_PATH];memset(buf,0,sizeof(buf));GetCurrentPath(buf,CONF_FILE_PATH);strcpy(g_szConfigPath,buf);int iCatAge;char szCatName[32];iCatAge = GetIniKeyInt("CAT","age",g_szConfigPath);strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));return 0;}感觉作者的程序还有⼏处bug第86⾏#ifndef WIN32i--;#endif这个地⽅如果是吧linux下的配置⽂件拿到windows上⽤呢,⼜假如我⽤editplus或者ultraedit等⼯具修改了⽂件换⾏⽅式呢?应改为if(szLine[i-1] == '\r') {i--;}第95⾏,if(strstr(szLine,key)!=NULL)判断szLine中不含有key字符串后,应该将szLine清零,以备下次循环的时候使⽤,所以这个地⽅应该加⼀个else语句else{memset(szLine,0,1024);}第76⾏,if(rtnval == EOF)这个地⽅如果判断⽂件结尾了就退出,但是如果配置⽂件的最后⼀⾏的末尾是EOF的话,这个地⽅就出错了即最后⼀⾏是这种情况xxxxxxEOF如果最后⼀⾏是如下情况的话,是能通过的,作者肯定是只考虑了这种情况xxxxxxEOF所以这个地⽅应该改为if(rtnval == EOF && sizeof(szLine) != 0)还有就是顺便提⼀下作者的main函数中第148⾏,strcpy(szCatName,GetIniKeyString("CAT","name",g_szConfigPath));我也不是很推荐这么写,你程序内部的是按照每⾏1024个处理的,所以这个地⽅还是写成strncpy⽐较好。
读取配置文件的C语言接口实现
读取配置⽂件的C语⾔接⼝实现在⼀些场合,需要对⼀些配置⽂件进⾏读取,去设置软件的参数,⾃⼰实现了⼀些接⼝函数,以供以后使⽤。
ConfigFile.c1 #include <stdio.h>2 #include <stdlib.h>3 #include <ctype.h>4 #include <direct.h>5#define MAX_LINE_LENGTH 25667int read_line(FILE *fp, char *bp)8 {9char c = '\0';10int i = 0;11bool isAssgin = 0;12/* Read one line from the source file */13while (1)14 {15 c = getc(fp);16if (c == '\n')17 {18break;19 }2021if (c == '\r')22 {23continue;24 }2526if (c == '=')27 {28 isAssgin = 1;29 }3031if (feof(fp))32 {33/* return FALSE on unexpected EOF */34if (isAssgin == 1)35 {36 bp[i] = '\0';37return(1);38 }39else40 {41return(0);42 }43 }44 bp[i++] = c;45 }46 bp[i] = '\0';47return(1);48 }49/************************************************************************50* Function: Get_private_profile_int()51* Arguments: <char *> section - the name of the section to search for52* <char *> entry - the name of the entry to find the value of53* <int> def - the default value in the event of a failed read54* <char *> file_name - the name of the .ini file to read from55* Returns: the value located at entry56*************************************************************************/57int Get_private_profile_int(const char *section, const char *entry, int def, char *file_name)58 {59 FILE *fp = fopen(file_name, "r");60//Try to fix the issue that the MAX_PATH should be 256, not 8061char buff[MAX_LINE_LENGTH];62char *ep;63char t_section[MAX_LINE_LENGTH];64char value[12];65int len = strlen(entry);66int i;67//To support negative number convert68bool b_IsNegative = false;69if (!fp)70 {71return(0);72 }73 sprintf(t_section, "[%s]", section); /* Format the section name */74/* Move through file 1 line at a time until a section is matched or EOF */75do77if (!read_line(fp, buff))78 {79 fclose(fp);80return(def);81 }82 }while (strcmp(buff, t_section));83/* Now that the section has been found, find the entry.84 * Stop searching upon leaving the section's area. */85do86 {87if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '\0' to '[' for parser ini bug.88 {89 fclose(fp);90return(def);91 }92 }while (strncmp(buff, entry, len));9394 ep = strrchr(buff, '='); /* Parse out the equal sign */95 ep++;96if (!strlen(ep)) /* No setting? */97 {98return(def);99 }100/* Copy only numbers fail on characters */101//To support negative number convert102if (ep[0] == '-')103 {104 b_IsNegative = true;105for (i = 1; isdigit(ep[i]); i++)106 {107 value[i - 1] = ep[i];108 }109 value[--i] = '\0';110 }111else112 {113for (i = 0; isdigit(ep[i]); i++)114 {115 value[i] = ep[i];116 }117 value[i] = '\0';118 }119 fclose(fp); /* Clean up and return the value */120//To support negative number convert121if (b_IsNegative)122 {123return (0 - atoi(value));124 }125else126 {127return(atoi(value));128 }129 }130131132 unsigned long long Get_private_profile_longlong(const char *section, const char *entry, unsigned long long def, char *file_name) 133 {134 FILE *fp = fopen(file_name, "r");135char buff[MAX_LINE_LENGTH];136char *ep;137char t_section[MAX_LINE_LENGTH];138char value[16];139int len = strlen(entry);140int i;141if (!fp)142 {143return(0);144 }145 sprintf(t_section, "[%s]", section); /* Format the section name */146/* Move through file 1 line at a time until a section is matched or EOF */147do148 {149if (!read_line(fp, buff))150 {151 fclose(fp);152return(def);153 }154 }while (strcmp(buff, t_section));155/* Now that the section has been found, find the entry.156 * Stop searching upon leaving the section's area. */157do158 {159if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '\0' to '[' for parser ini bug.161 fclose(fp);162return(def);163 }164 }while (strncmp(buff, entry, len));165166 ep = strrchr(buff, '='); /* Parse out the equal sign */167 ep++;168if (!strlen(ep)) /* No setting? */169 {170return(def);171 }172/* Copy only numbers fail on characters */173for (i = 0; isdigit(ep[i]); i++)174 {175 value[i] = ep[i];176 }177 value[i] = '\0';178 fclose(fp); /* Clean up and return the value */179return(_atoi64(value));180 }181182/**************************************************************************183* Function: Get_private_profile_string()184* Arguments: <char *> section - the name of the section to search for185* <char *> entry - the name of the entry to find the value of186* <char *> def - default string in the event of a failed read187* <char *> buffer - a pointer to the buffer to copy into188* <int> buffer_len - the max number of characters to copy189* <char *> file_name - the name of the .ini file to read from190* Returns: the number of characters copied into the supplied buffer191***************************************************************************/192int Get_private_profile_string(const char *section, const char *entry, const char *def, char *buffer, int buffer_len, char *file_name) 193 {194195 FILE *fp = fopen(file_name, "r");196char buff[MAX_LINE_LENGTH];197char *ep;198char t_section[MAX_LINE_LENGTH];199int len = strlen(entry);200if (!fp)201 {202return(0);203 }204 sprintf(t_section, "[%s]", section); /* Format the section name */205/* Move through file 1 line at a time until a section is matched or EOF */206do207 {208if (!read_line(fp, buff))209 {210 strncpy(buffer, def, buffer_len);211return(strlen(buffer));212 }213 }while (strcmp(buff, t_section));214/* Now that the section has been found, find the entry.215 * Stop searching upon leaving the section's area. */216do217 {218if (!read_line(fp, buff) || buff[0] == '[') //130516 Willy modify '\0' to '[' for parser ini bug.219 {220 fclose(fp);221 strncpy(buffer, def, buffer_len);222return(strlen(buffer));223 }224 }while (strncmp(buff, entry, len));225226 ep = strrchr(buff, '='); /* Parse out the equal sign */227do228 {229 ep++;230 }while(!strncmp(ep, "", 1)); //Remove the blank space231232/* Copy up to buffer_len chars to buffer */233 strncpy(buffer, ep, buffer_len - 1);234 buffer[buffer_len - 1] = '\0';235 fclose(fp); /* Clean up and return the amount copied */236return(strlen(buffer));237 }238int Get_private_profile_hex(const char *section, const char *entry, int def, char *file_name)239 {240char valBuf[16], valBuf2[16];241int data;242243 memset(valBuf, 0, sizeof(valBuf));245246 sprintf(valBuf2, "0x%x", def);247 Get_private_profile_string(section, entry, valBuf2, &valBuf[0], sizeof(valBuf), file_name);248 data = 0;249 sscanf(valBuf, "0x%x", &data);250return data;251 }252253/*************************************************************************254 * Function: Write_private_profile_string()255 * Arguments: <char *> section - the name of the section to search for256 * <char *> entry - the name of the entry to find the value of257 * <char *> buffer - pointer to the buffer that holds the string258 * <char *> file_name - the name of the .ini file to read from259 * Returns: TRUE if successful, otherwise FALSE260 *************************************************************************/261int Write_private_profile_string(const char *section, const char *entry, char *buffer, char *file_name) 262 {263 FILE *rfp, *wfp;264char tmp_name[15];265//Try to fix the issue that the MAX_PATH should be 256, not 80266char buff[MAX_LINE_LENGTH];267char t_section[MAX_LINE_LENGTH];268int len = strlen(entry);269 tmpnam(tmp_name); /* Get a temporary file name to copy to */270 sprintf(t_section, "[%s]", section); /* Format the section name */271272 rfp = fopen(file_name, "r");273if (!rfp) /* If the .ini file doesn't exist */274 {275 wfp = fopen(file_name, "w");276if (!wfp) /* then make one */277 {278return(0);279 }280 fprintf(wfp, "%s\n", t_section);281 fprintf(wfp, "%s=%s\n", entry, buffer);282 fclose(wfp);283return(1);284 }285286 wfp = fopen(tmp_name, "w");287if (!wfp)288 {289 fclose(rfp);290return(0);291 }292293/* Move through the file one line at a time until a section is294 * matched or until EOF. Copy to temp file as it is read. */295do296 {297if (!read_line(rfp, buff))298 {299/* Failed to find section, so add one to the end */300 fprintf(wfp, "\n%s\n", t_section);301 fprintf(wfp, "%s=%s\n", entry, buffer);302/* Clean up and rename */303 fclose(rfp);304 fclose(wfp);305 unlink(file_name);306 rename(tmp_name, file_name);307return(1);308 }309 fprintf(wfp, "%s\n", buff);310 }while (strcmp(buff, t_section));311312/* Now that the section has been found, find the entry. Stop searching313 * upon leaving the section's area. Copy the file as it is read314 * and create an entry if one is not found. */315while (1)316 {317if (!read_line(rfp, buff))318 {319/* EOF without an entry so make one */320 fprintf(wfp, "%s=%s\n", entry, buffer);321/* Clean up and rename */322 fclose(rfp);323 fclose(wfp);324 unlink(file_name);325 rename(tmp_name, file_name);326return(1);327329if (!strncmp(buff, entry, len) || buff[0] == '\0')330 {331break;332 }333 fprintf(wfp, "%s\n", buff);334 }335336if (buff[0] == '\0')337 {338 fprintf(wfp, "%s=%s\n", entry, buffer);339do340 {341 fprintf(wfp, "%s\n", buff);342 }343while (read_line(rfp, buff));344 }345else346 {347 fprintf(wfp, "%s=%s\n", entry, buffer);348while (read_line(rfp, buff))349 {350 fprintf(wfp, "%s\n", buff);351 }352 }353/* Clean up and rename */354 fclose(wfp);355 fclose(rfp);356 unlink(file_name);357 rename(tmp_name, file_name);358return(1);359 }360361int Write_private_profile_int(const char *section, const char *entry, int data, char *file_name)362 {363char valBuf[16];364 memset(valBuf, 0, 16);365 sprintf(valBuf, "%d", data);366return Write_private_profile_string(section, entry, valBuf, file_name);367 }368369 unsigned long long Write_private_profile_longlong(const char *section, const char *entry, unsigned long long data, char *file_name)370 {371char valBuf[16];372 memset(valBuf, 0, 16);373 sprintf(valBuf, "%Lu", data);374return Write_private_profile_string(section, entry, valBuf, file_name);375 }ConfigFile.h1 #ifndef _CONFIGFILE_H_2#define _CONFIGFILE_H_34extern int Get_private_profile_int(const char *section, const char *entry, int def, char *file_name);5extern unsigned long long Get_private_profile_longlong(const char *section, const char *entry, unsigned long long def, char *file_name);6extern int Get_private_profile_string(const char *section, const char *entry, const char *def, char *buffer, int buffer_len, char *file_name); 7extern int Get_private_profile_hex(const char *section, const char *entry, int def, char *file_name);89extern int Write_private_profile_string(const char *section, const char *entry, char *buffer, char *file_name);10extern int Write_private_profile_int(const char *section, const char *entry, int data, char *file_name);11extern unsigned long long Write_private_profile_longlong(const char *section, const char *entry, unsigned long long data, char *file_name); 1213#endif//_CONFIGFILE_H_测试:当前⽬录下Autoconfig.ini⽂件的内容为测试源码:main.c1 #include <stdio.h>2 #include <stdlib.h>3 #include <ctype.h>4 #include <direct.h>5 #include "GetConfig.h"6#define DEFAULT_INI_FILE "\\Autoconfig.ini"78int main(int argc, char* argv[])9 {10char ProductModel[80];11char iniFile[256];13 buffer = getcwd(NULL, 0);14 strcpy(iniFile, buffer);15 strcat(iniFile,DEFAULT_INI_FILE);1617 Get_private_profile_string("Setting", "ProductModel", "SS", ProductModel, sizeof(ProductModel), iniFile);18 printf("ProductModel:%s\n",ProductModel);1920 unsigned char enExtendBlock = Get_private_profile_int("FwSetting", "EnExtendBlock", 1, iniFile);21 printf("enExtendBlock:%d\n",enExtendBlock);2223int MPVersion = 100;24 Write_private_profile_int("Setting", "MPVersion", MPVersion, iniFile);2526 sprintf(ProductModel,"ABCSFE!!221");27 Write_private_profile_string("Setting", "ProductModel", ProductModel, iniFile);2829 }。
Linux下读取配置文件conf的C语言函数库ccl
Linux下读取配置文件conf的C语言函数库cclLinux下读取配置⽂件conf的C语⽂函数库ccl Introductionccl is the customizable configuration library, a collection of functions for application programmers wishing to interface with user-editable configuration files containing key/value pairs.ccl is customizable because it allows the comment, key/value, and string literal delimiters to be programatically specified at runtime. ccl is designed to be simple and portable; it has a small interface consisting of five functions and is written in ANSI/ISO C. ccl uses avl’s implemenation of binary search trees for backend storage.Download## Sample configuration fileDesktop-Picture = /usr/images/earth.jpgPosition = Centered"Background Color" = BlackThe following code demonstrates how to parse and access this file using ccl:#include "ccl/ccl.h"struct ccl_t config;const struct ccl_pair_t *iter;/* Set configuration file details */ment_char = '#';config.sep_char = '=';config.str_char = '"';/* Parse the file */ccl_parse(&config, "example.conf");/* Iterate through all key/value pairs */while((iter = ccl_iterate(&config)) != 0) {printf("(%s,%s)n", iter->key, iter->value);}/* Clean up */ccl_release(&config);When compiled, the snippet above produces the output (Background Color,Black)(Desktop-Picture,/usr/images/earth.jpg) (Position,Centered)。
CPP读取配置文件
// ReadConfig.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include <iostream>#include <fstream>using namespace std;void InitFact(char* pFile);int main(int argc, char* argv[]){char* pFile = "pro.txt";InitFact(pFile);return 0;}void InitFact(char* pFile){ifstream ifile;ifile.open(pFile,ios_base::in);if (!ifile.is_open()){cerr << "Cannot open The " << pFile <<endl;}char buff[256];memset(buff,0x00,256);while (ifile.getline(buff,256,'\n')){ifile.getline(buff,256,'\n');char MsgName[256] = {0};strncpy(MsgName,buff,256);cout << MsgName << endl;memset(buff,0x00,256);ifile.getline(buff,256,'\n');char MsgType[256] = {0};strncpy(MsgType,buff,256);cout << MsgType << endl;memset(buff,0x00,256);while (ifile.getline(buff,256,'\n') && buff[0] != NULL){cout << buff << endl;memset(buff,0x00,256);}//end while(buff[0] != null)}//end while(ifile.getline())}//pro.txt文件的内容格式[qq登陆消息]commandID:1213logID | string | 12passwd | string | 20[聊天消息]commandID:25432name | string | 4passwd | int | 4content | string| 256[发送图片消息]commandID:25431srcDeviceType |int |4srcDeviceId |string |20destDeviceType |int |4destDeviceId |string |20transactionID |string |40userIdType |int |4userId |string |36serviceIdType |int |4spId |string |21productID |string |21ordertype |int |4confilctSolve |int |4bsspChargeParty |int |4Fee |int |4ServiceNumber |int |4pServiceIDList |string |21。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//----------------------------------------------------------------------------
#ifndef __READ_CONF_FILE_H__
//
// DESCRIPTION
// Generally get some variable settings from configure file
/*
操作配置文件的代码,每一行不超过1024字符。
1.有注释,以#打头,行首空格要忽略
2.一个参数占一行,配置项格式
#define CONF_LINE_DEFAULT 0x02 /* 配置项默认*/
#define CONF_LINE_COMMENT 0x03 /* 注释*/
#define CONF_LINE_EMPTY 0x04 /* 空行*/
#define CONF_LINE_UNSUPPORT 0x05 /* 不支持的变量*/
#define __READ_CONF_FILE_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#define __CONF_DEBUG__
变量名 = 变量值
变量名= (也合法. =两边有无空格不影响结果,值可以为空格)
3.写程序的人一定知道他要读取哪一些变量,以及变量的含义和格式
4.没有出现变量自动采用默认值
5.变量前后顺序不影响最终结果。即配置变量可以调整顺序.
#this is a commant
set = 1
ipaddr = 192.168.0.1
host=
扩展:1.增加段支持 [network]
2.变量归属于某一个段的
3.没有属于某段的变量自动变成全局
无限分段的设计
[com1]
baudrate=115200
//-----------------------------------read_conf.c
/*
无论是在桌面机或者嵌入式应用里,用配置文件来保存不同参数是很常见的应用。
如果用C语言来处理配置文件,是一个很实际的应用。
主要使用函数指针,大量用到字符串解析,
可以通过定义不同static CONF_ITEM conf_list[]来实现读不同配置参数
{NULL, conf_integer, 0, NULL, NULL}, //结束标志
#endif
};
*/
#ifdef __cplusplus
}
#endif
#endif // end of __READ_CONF_FILE_H__
//#define __CONF_FIELD_SUPPORT__
#define LINE_SIZE 1024
#define COMMENT_CHARACTER '#'
#define ASSIGN_CHARACTER '='
#ifdef __CONF_FIELD_SUPPORT__
#define CONF_LINE_UNKNOW 0x06 /* 无法识别的行,无"=" */
//enum 相当于取值范围受限的一个整数
typedef enum conf_val_type {
conf_integer = 0,
conf_string = 2,
conf_ipaddr = 4,
//-----------------------------------read_conf.h
/*
无论是在桌面机或者嵌入式应用里,用配置文件来保存不同参数是很常见的应用。
如果用C语言来处理配置文件,是一个很实际的应用。
主要使用函数指针,大量用到字符串解析,
可以通过定义不同static CONF_ITEM conf_list[]来实现读不同配置参数
/*
static CONF_ITEM conf_list[] = { // 配置项列表示例
#ifdef __CONF_FIELD_SUPPORT__
{"test", "result_max", conf_integer, "19", NULL, conf_parse_integer },
// {FIELD_ALL, "host", conf_string, "hxy", NULL, conf_parse_string },
{NULL, NULL, conf_integer, 0, NULL, NULL}, //结束标志
*/
//----------------------------------------------------------------------------
//
// FILE NAME VERSION
// read_conf.c 1.0
#define SEG_BEGIN_CHARACTER '['
#define SEG_END_CHARACTER ']'
#define FIELD_ALL "all"
#endif
#define CONF_LINE_FIELD 0x00 /* 配置段行*/
#define CONF_LINE_CONFIGURE 0x01 /* 配置项行*/
extern int conf_parse_string(void * conf_result, void * p_conf_item);
extern int conf_parse_ipaddr(void * conf_result, void * p_conf_item);
extern int free_conf_value(CONF_ITEM * p_conf_list);
{"ipaddr", conf_ipaddr, "192.168.1.1", NULL, conf_parse_ipaddr },
{"host", conf_string, "hxy", NULL, conf_parse_string },
{"start_num", conf_integer, "1", NULL, conf_parse_integer },
{"equ_num_max", conf_integer, "20", NULL, conf_parse_integer },
*/
//----------------------------------------------------------------------------
//
// FILE NAME VERSION
// read_conf.c 1.0
#endif
extern int parse_conf_file(CONF_ITEM * p_conf_list, char * conf_file_name);
extern int conf_parse_integer(void * conf_result, void * p_conf_item);
{FIELD_ALL, "num_max", conf_integer, "9", NULL, conf_parse_integer },
{FIELD_ALL, "start_num", conf_integer, "1", NULL, conf_parse_integer_max", conf_integer, "19", NULL, conf_parse_integer },
{"num_max", conf_integer, "9", NULL, conf_parse_integer },
stopbit = 1
...
[com2]
baudrate=9600
stopbit=2
...
...
*/
// DEPENDENCIES
// stdio.h
// stdlib.h
// string.h
//
// HISTORY:
} CONF_VAL_TYPE;
typedef struct conf_item{
#ifdef __CONF_FIELD_SUPPORT__
char * field; // 配置项域
#endif
char * name; // 配置项名字
{FIELD_ALL, "equ_num_max", conf_integer, "20", NULL, conf_parse_integer },
// {FIELD_ALL, "ipaddr", conf_ipaddr, "192.168.1.1", NULL, conf_parse_ipaddr },
//
// DESCRIPTION