#ifndef __CFG_OP_H__
#define __CFG_OP_H__ #ifdef __cplusplus
extern "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 = ;
FILE *fp = NULL;
char *pTmp = NULL, *pEnd = NULL, *pBegin = NULL; char lineBuf[MaxLine]; fp = fopen(pFileName, "r");//读的方式打开文件
if (fp == NULL)
{
ret = -;
return ret;
} while (!feof(fp))//没有到达文件末尾
{
memset(lineBuf, , 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);//所在行 是不是有key
if (pTmp == NULL) //判断key是不是在
{
continue;
}
pTmp = pTmp + strlen(pKey); //mykey1 = myvalude11111111 ==> "= myvalude1111111" pTmp = strchr(pTmp, '=');
if (pTmp == NULL) //判断key是不是在 //所在行 是不是有key
{
continue;
}
pTmp = pTmp + ;
//
//printf("pTmp:%s ", pTmp); //获取value 起点
while ()
{
if (*pTmp == ' ')
{
pTmp ++ ;
}
else
{
pBegin = pTmp;
if (*pBegin == '\n')
{
//没有配置value
//printf("配置项:%s 没有配置value \n", pKey);
goto End;
}
break;
}
} //获取valude结束点
while ()
{
if ((*pTmp == ' ' || *pTmp == '\n'))
{
break;
}
else
{
pTmp ++;
}
}
pEnd = pTmp; //赋值
*pValueLen = pEnd-pBegin;
memcpy(pValue, pBegin, pEnd-pBegin);
} End:
if (fp == NULL)
{
fclose(fp);
}
return ; } //写配置项
//实现流程
//循环读每一行,检查key配置项是否存在 若存在修改对应value值
//若不存在,在文件末尾 添加 "key = value"
//难点:如何修改文件流中的值
int WriteCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in*/, int ValueLen /*in*/)
{
int rv = , iTag = , length = ;
FILE *fp = NULL;
char lineBuf[MaxLine];
char *pTmp = NULL, *pBegin = NULL, *pEnd = NULL;
char filebuf[*] = {}; if (pFileName==NULL || pKey==NULL || pValue==NULL)
{
rv = -;
printf("SetCfgItem() err. param err \n");
goto End;
} fp = fopen(pFileName, "r+");
if (fp == NULL)
{
rv = -;
printf("fopen() err. \n");
//goto End;
} if (fp == NULL)//文件不存在就去创建一个文件
{
fp = fopen(pFileName, "w+t");
if (fp == NULL)
{
rv = -;
printf("fopen() err. \n");
goto End;
}
} fseek(fp, 0L, SEEK_END); //刚开始文件指针指向的是文件的开头,把文件指针从0位置开始,移动到文件末尾
//获取文件长度;
length = ftell(fp);//fp指向了文件的末尾 fseek(fp, 0L, SEEK_SET);//再把文件指针指向文件的头部 if (length > *) //文件不能超过8K,不然内存不支持
{
rv = -;
printf("文件超过1024*8, nunsupport");
goto End;
} while (!feof(fp))
{
//读每一行
memset(lineBuf, , 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);
//若存在key
iTag = ;
}
} //所有的行中若key关键字,不存在 追加
if (iTag == )
{
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 = -;
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 = ;
//读配置项
char name[] = {};
char valude[] = {};
int vlen = ; printf("\n请键入key:");
scanf("%s", name); ret = GetCfgItem(CFGNAME /*in*/, name /*in*/, valude/*in*/, &vlen);
if (ret != )
{
printf("func WriteCfgItem err:%d \n", ret);
return ret;
}
printf("valude:%s \n", valude); } //写配置项
int TWriteCfg()
{
int ret = ;
//写配置项
char name[] = {};
char valude[] = {}; 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 != )
{
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)
{ case : //写配置项
TWriteCfg();
break;
case :
TGetCfg(); //读配置项
break;
case :
exit();
default:;
exit();
} }
printf("hello...\n");
system("pause");
return ;
}

C读取配置文件的更多相关文章

  1. 【无私分享:ASP.NET CORE 项目实战(第八章)】读取配置文件(二) 读取自定义配置文件

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 我们在 读取配置文件(一) appsettings.json 中介绍了,如何读取appsettings.json. 但随之产生 ...

  2. 解决IntelliJ IDEA无法读取配置文件的问题

    解决IntelliJ IDEA无法读取配置文件的问题 最近在学Mybatis,按照视频的讲解在项目的某个包里建立配置文件,然后读取配置文件,但是一直提示异常. 读取配置文件的为官方代码: String ...

  3. java-工具类-读取配置文件

    java读取配置文件,当发现文件被修改后则重新加载 package com.zg.config; import java.io.File; import java.io.FileInputStream ...

  4. java 4种方式读取配置文件 + 修改配置文件

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 方式一采用ServletContext读取读取配置文件的realpath然后通过文件流读取出来 方式二采用ResourceB ...

  5. 在IIS Express中调试时无法读取配置文件 错误

    在IIS Express中调试代码时,如果出现"无法读取配置文件"的问题(如图),这种情况是IIS Express的"applicationhost.config&quo ...

  6. ASP.NET Core开发-读取配置文件Configuration

    ASP.NET Core 是如何读取配置文件,今天我们来学习. ASP.NET Core的配置系统已经和之前版本的ASP.NET有所不同了,之前是依赖于System.Configuration和XML ...

  7. Java 利用 ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件

    最近参与了github上的一个开源项目 Mycat,是一个mysql的分库分表的中间件.发现其中读取配置文件的代码,存在频繁多次重复打开,读取,关闭的问题,代码写的很初级,稍微看过一些框架源码的人,是 ...

  8. Python+Selenium进行UI自动化测试项目中,常用的小技巧2:读取配置文件(configparser,.ini文件)

    在自动化测试项目中,可能会碰到一些经常使用的但 很少变化的配置信息,下面就来介绍使用configparser来读取配置信息config.ini 读取的信息(config.ini)如下: [config ...

  9. win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面

    错误一: HTTP Error 500.19 - Internal Server Error配置错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的 (ov ...

  10. python中读取配置文件ConfigParser

    在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单的做一些介 ...

随机推荐

  1. UVA 10529-Dumb Bones(概率dp)

    题意: 给出放一个多米诺骨牌,向左向右倒的概率,求要放好n个骨牌,需要放置的骨牌的期望次数. 分析: 用到区间dp的思想,如果一个位置的左面右面骨牌都已放好,考虑,放中间的情况, dp[i]表示放好前 ...

  2. webpack入门级教程

    Webpack是什么 首先可以看下官方文档,文档是最好的老师. 这里也有国外的一个朋友写的入门介绍. Webpack是由Tobias Koppers开发的一个开源前端模块构建工具.它的基本功能是将以模 ...

  3. UVALive 4763

    一开始,没敢写,感觉会超时...其实就是暴力搜索.DFS #include<iostream> #include<stdio.h> #include<string.h&g ...

  4. Python面向对象2

    方法 公共方法 私有方法 类方法 静态方法 #!usr/bin/python #coding:utf8 class Milo(): name = 'csvt' def fun1(self): prin ...

  5. WinDriver&amp;PCIE

    1.安装VS2012 安装VS2012略过,主要用它来做数据传输应用程序的,WINDRIVER提供了一系列API接口,方便了用户,使用户能直接进入用户态的编程,因为内核态的编程它已做好,不需要进行修改 ...

  6. 最短路径算法(Dijkstra算法、Floyd-Warshall算法)

    最短路径算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题.适合使用Dijkstra算法. 确定终点的最短路径问题:即已知终结结点,求最短路径的问题.在无向图中,该问题与确 ...

  7. C++问题-Qt Visual Studio Add-in

    问题现象:用VS打开其他人的项目提示如下:Qt Visual Studio Add-in...中间全TMD的英文,我就省略...QT版本不对,需要修改QT版本. 问题原因:占时不明,因为我是开发Del ...

  8. [iOS 多线程 & 网络 - 1.2] - 多线程GCD

    A.GCD基本使用 1.GCD的概念 什么是GCD全称是Grand Central Dispatch,可译为"牛逼的中枢调度器"纯C语言,提供了非常多强大的函数GCD的优势GCD是 ...

  9. TQ210裸机编程(4)——按键(中断法)

    S5PV210有4个向量中断控制器(VIC),每个向量中断控制器包含32个中断源. 当某个中断源产生中断时,CPU会自动的将VICxVECTADDRy(x=0,1,2,3,y=0-31)寄存器的值赋给 ...

  10. Codeforces Round #353 (Div. 2) D. Tree Construction (二分,stl_set)

    题目链接:http://codeforces.com/problemset/problem/675/D 给你一个如题的二叉树,让你求出每个节点的父节点是多少. 用set来存储每个数,遍历到a[i]的时 ...