getstring函数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值