mfc中添加c语言函数吗,用C语言实现MFC库函数GetPrivteProfileString

MFC中此函数GetPrivteProfileString可以用来读取配置文件.ini的函数,它在VS2008的msdn中的定义是这样的:

GetPrivateProfileString Function

Retrieves a string from the specified section in an initialization file.

翻译过来就是返回初始化文件中特定区域的字符串。参数如下:

DWORD WINAPI GetPrivateProfileString(

__inLPCTSTR lpAppName,

__inLPCTSTR lpKeyName,

__inLPCTSTR lpDefault,

__outLPTSTR lpReturnedString,

__inDWORD nSize,

__inLPCTSTR lpFileName

);

第一个LPCTSTR类型的lpAppName是定值区间,第二个是要读的字符串的名,第三个默认值为NULL,第四个为返回值,返回读到的字符串,第五个设置第四个参数(字符串)的大小,第六个为初始化文件路径。

这里假设初始化文件如下:

[function]

func1 = init

func2 = paint

func3 = read

func4 = write

func5 = exit

[parameter]

para1 = void

para2 = GDI

para3 = file

para4 = string

para5 = handle

我们要读取func2的值,那么读取方法就是

CString strVal;

DWORD size = 1000;

GetPraviteProfileString(_T("function"),_T("func2"),_T("Not Found"),strVal,GetBuffer(size),size,path);

_T("Not Found")为默认字符,即没找到时返回的值,path为文件路径。

然而当我们在移植程序到嵌入式系统时,这样的MFC函数是要不得的,我所使用的方法就是重写这个函数,用C语言写说到底就是字符串匹配的过程了,涉及到文件的就变成了FILE或fstream了,这里选用FILE,看代码吧

#define MAX_STRLEN 65 //规定最长字符串长度,分配内存、拷贝用 #define MAX_NUM 100 //规定最多可存储的单元数 typedef struct { char func[MAX_STRLEN]; char *data; }FUNC; typedef struct { char para[MAX_STRLEN]; char *data; }PARA; //分别用于存储function和parameter FUNC *func; PARA *para; bool Mine_Init(char* cfg_filename) { func = (FUNC*)malloc(sizeof(FUNC)*MAX_NUM); para = (PARA*)malloc(sizeof(PARA)*MAX_NUM); FILE *in_fp; char in_buf[MAX_STRLEN] = {0}; /* 从文件中读出的每一行的缓冲区 */ FUNC *ptrf = NULL; PARA *ptrp = NULL; char *str = NULL; char substr[] = "/n"; bool is_func = false; bool is_para = false; int index_func = 0; int index_para = 0; in_fp = fopen (cfg_filename, "r"); if (in_fp == NULL) { printf("/nError, %s not found!",cfg_filename); return false; } while (fgets(in_buf,sizeof(in_buf),in_fp) != NULL) { str = strpbrk(in_buf,substr); *str = '/0'; if (!strcmp(in_buf,"[function]")) { //存function ptrf = (FUNC*)func; is_func = true; } else if(!strcmp(in_buf,"[parameter]")) { //存parameter ptrf = NULL;//读完function的值,要把指针清掉,否则又会跳进Write_FUNC ptrp = (PARA*)para; is_para = true; } else if (ptrf != NULL) { if ( Write_FUNC(ptrf, in_buf, in_fp, index_func, is_func) == -1)//写入function值 { return false; } } else if (ptrp != NULL) { if ( Write_PARA(ptrp, in_buf, in_fp, index_para, is_para) == -1)//写入parameter值 { return false; } } else { fclose(in_fp); return false; } } fclose(in_fp); return true; }

下面是两个写入数据结构的函数,我的程序不能随机的读某个节点,只能一次性将节点全部读入数据结构

里存储,有更好的方法还望指教!!

int Write_FUNC(FUNC* ptr, char* in_buf, FILE *in_fp, int& index_func, bool is_func) { assert(ptr && in_fp); memcpy(ptr, in_buf, MAX_STRLEN); if (is_func) { ZeroMemory(in_buf, MAX_STRLEN); fgets(in_buf, MAX_STRLEN, in_fp); (func + index_func)->data = (char*)malloc(MAX_STRLEN);//这里要初始化,否则会 出错 memcpy((func + index_func)->data,in_buf,MAX_STRLEN); index_func++; } return 0; } int Write_PARA(PARA* ptr, char* in_buf, FILE *in_fp, int& index_para, bool is_para) { assert(ptr && in_fp); memcpy(ptr, in_buf, MAX_STRLEN); if (is_para) { ZeroMemory(in_buf, MAX_STRLEN); fgets(in_buf, MAX_STRLEN, in_fp); (para + index_para)->data = (char*)malloc(MAX_STRLEN); memcpy((para + index_para)->data,in_buf,MAX_STRLEN); index_para++; } return 0; }

从函数中可以看到,in_buf是一行一行的读取到数据的,所以对应的配置文件格式也要有所变化

[function]

func1

init

func2

paint

func3

read

func4

write

func5

exit

[parameter]

para1

void

para2

GDI

para3

file

para4

string

para5

handle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值