急求~!读写ini文件的纯C方法

8thdetective 2004-09-24 02:24:44
因为在linux下面开放,所以需要纯C的读写ini文件的代码。。。请有资源的朋友共享一下好吗
谢谢
...全文
430 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
223xh 2005-04-01
  • 打赏
  • 举报
回复
好帖啊,怎么这么久还不结帖,估计楼主忘了,等版主帮忙结吧
sunshine217 2004-09-26
  • 打赏
  • 举报
回复
不错
xiaokaiye 2004-09-26
  • 打赏
  • 举报
回复
求人不如求己
8thdetective 2004-09-25
  • 打赏
  • 举报
回复
感谢,虽然问题只有5分却得到那么多的回复。
wshcdr 2004-09-25
  • 打赏
  • 举报
回复
MARK下
srastat 2004-09-24
  • 打赏
  • 举报
回复
上面函数的用法
GetInitKey("/usr/tjgc/kpys/ptssysf.ini", "path", "kp_path")
↑配置文件位置 ↑段号 ↑具体值

[path]
kp_path=20

strcpy(pathvalue,GetInitKey("/usr/tjgc/kpys/ptssysf.ini", "path", "kp_path"))
字符串pathvalue就是“20”

保证没错!错了打我板子!
(我在unix下编的N多程序都是这么用的,至今还没发现错误)
srastat 2004-09-24
  • 打赏
  • 举报
回复
上面函数的用法
GetInitKey("/usr/tjgc/kpys/ptssysf.ini", "path", "kp_path")
↑配置文件位置 ↑段号 ↑具体值

[path]
kp_path=20

strcpy(pathvalue,GetInitKey("/usr/tjgc/kpys/ptssysf.ini", "path", "kp_path"))
字符串pathvalue就是“20”
srastat 2004-09-24
  • 打赏
  • 举报
回复
char * GetInitKey(char *filename, char *title,char *key)
{
FILE * fp;
char tmpLine[1024];
int rtnval;
int i = 0;
int flag = 0;
char * tmp;
static char tmpstr[1024];

if ( (fp=fopen( filename, "r")) == NULL )
return "1";
while ( !feof( fp ) )
{
rtnval = fgetc( fp );
if ( rtnval == EOF )
{
break;
}
else
tmpLine[i++] = rtnval;
if ( rtnval == '\n')
{
tmpLine[--i]=0;
i = 0;
tmp = strchr(tmpLine, '=');

if (( tmp != NULL )&&(flag == 1))
{
if (strstr(tmpLine,key)!=NULL)
{
strcpy ( tmpstr, tmp + 1 );
fclose ( fp );
return tmpstr;
}
}
else
{
strcpy(tmpstr,"[");
strcat(tmpstr,title);
strcat(tmpstr,"]");
if (strcmp(tmpstr,tmpLine)==0)
flag = 1;
}

}
}
fclose ( fp );
return "";
}
xiao_wang 2004-09-24
  • 打赏
  • 举报
回复
mark
applebomb 2004-09-24
  • 打赏
  • 举报
回复
我认为对于纯C读写INI应该读INI文件后在内存中形成一个链表,其NODE就两个数据项,KEY和VALUE,然后它的修改是对于内存链表操作,用完后再写回INI文件。
ironfox 2004-09-24
  • 打赏
  • 举报
回复
LoadFile::LoadFile(char *filename)
{
f = fopen(filename,"rb");

return;

}

BOOL LoadFile::GetItem(char *blockname,char *itemname,int itemtype,...)
{
va_list p;
va_start(p,itemtype);
char linebuf[FILE_COLUMN_MAX];
BOOL fInBlock=FALSE;
fseek(f,0,SEEK_SET);

char *ptr,*endp,item[ITEM_NAME_MAX],block[ITEM_NAME_MAX],temp[FILE_COLUMN_MAX];

if(!blockname)
fInBlock=TRUE; //add to support no blockname

while( ptr=fgets(linebuf,FILE_COLUMN_MAX,f) )
{
while(*ptr==' '||*ptr=='\t')
ptr++;

if(*ptr==';')
continue;

if(blockname&&!fInBlock)
{
if(*ptr++=='[')
{
if(!(endp=strchr(ptr,']')))
continue;
memcpy(block,ptr,endp-ptr);
block[endp-ptr]=NULL;
if(strcmpi(block,blockname))
continue;
else
{ fInBlock=TRUE;
continue;
}
}
else
continue;
}

if(fInBlock&&*ptr=='[')
return FALSE;

if(!(endp=strchr(ptr,'=')))
continue;

memcpy(temp,ptr,endp-ptr);
temp[endp-ptr]=NULL;
StrCutSpace(temp,item);


if( !strcmpi(itemname,item) )
{
ptr=endp+1;

char *pte=strchr(ptr,'\r');
if(pte)
*pte=NULL;

StrCutSpace(ptr,temp);
ptr=temp;

if(itemtype==ITEM_LONG)
{ long *arg = va_arg(p,long*);
*arg = strtol(ptr,NULL,10);
}
else if(itemtype==ITEM_DWORD)
{ DWORD *arg = va_arg(p,DWORD*);
*arg = strtoul(ptr,NULL,16);
}
else if(itemtype==ITEM_STRING)
{
char *str = va_arg(p,char*);
strcpy(str,ptr);
}
return TRUE;
}
}

va_end(p);
return FALSE;
}


BOOL LoadFile::GetLong(char *blockname,char *itemname,long *data)
{
return GetItem(blockname,itemname,ITEM_LONG,(long*)data);
}

BOOL LoadFile::GetDword(char *blockname,char *itemname,DWORD *data)
{
return GetItem(blockname,itemname,ITEM_DWORD,(DWORD*)data);
}

BOOL LoadFile::GetStr(char *blockname,char *itemname,char *data)
{
return GetItem(blockname,itemname,ITEM_STRING,(char*)data);
}

BOOL LoadFile::GetSwitchState(char *blockname,char *itemname,BOOL &fSwitch)
{
char buf[30];

BOOL rc=GetStr(blockname,itemname,buf);
if(!rc)
return FALSE;

if(!strcmpi(buf,"TRUE")||!strcmp(buf,"1"))
fSwitch=TRUE;
else if(!strcmpi(buf,"FALSE")||!strcmp(buf,"0"))
fSwitch=FALSE;

return TRUE;
}
ironfox 2004-09-24
  • 打赏
  • 举报
回复
ini.c
===================
SaveFile::SaveFile(char *filename,int fmode)
{
_fstrcpy(file_name,filename);

fMode = fmode;

if(fMode==SAVE_NEW)
f = fopen(filename,"wb"); //Generate a New File
else if(fMode==SAVE_APPEND)
f = fopen(filename,"ab"); //Append to End of File
else if(fMode==SAVE_MODIFY)
f = fopen(filename,"r+b"); //Modify the Original File


return;
}

void SaveFile::AddBlock(char *blockname)
{
if(fMode==SAVE_MODIFY)
fseek(f,0,SEEK_END); //Seek to End of File

fprintf(f,"\r\n\r\n[%s]\r\n",blockname);
}


void SaveFile::AddItem(char *itemname,int itemtype,...)
{
va_list p;
va_start(p,itemtype);

if(fMode==SAVE_MODIFY)
fseek(f,0,SEEK_END); //Seek to End of File

if(itemtype==ITEM_LONG)
{ long arg = va_arg(p,long);
fprintf(f,"%s = %ld\r\n",itemname,arg);
}
else if(itemtype==ITEM_DWORD)
{ DWORD arg = va_arg(p,DWORD);
fprintf(f,"%s = 0x%08lX\r\n",itemname,arg);
}
else if(itemtype==ITEM_STRING)
{ char *arg = va_arg(p,char *);
fprintf(f,"%s = %s\r\n",itemname,arg);
}

va_end(p);
}


BOOL SaveFile::ChangeItem(char *blockname,char *itemname,int itemtype,...)
{
if(fMode!=SAVE_MODIFY)
return FALSE;

va_list p;
va_start(p,itemtype);
char linebuf[FILE_COLUMN_MAX];
BOOL fInBlock=FALSE;
char *ptr,*endp,item[ITEM_NAME_MAX],block[ITEM_NAME_MAX],temp[FILE_COLUMN_MAX];

fseek(f,0,SEEK_END);

DWORD fsize = ftell(f);

BYTE far *fbuf = new BYTE far [fsize+0x100];

fseek(f,0,SEEK_SET);

BOOL rc = fread(fbuf,1,fsize,f);

if(!rc)
{
delete [] fbuf;
return FALSE;
}

fseek(f,0,SEEK_SET);

while( ptr=fgets(linebuf,FILE_COLUMN_MAX,f) )
{
while(*ptr==' '||*ptr=='\t')
ptr++;

if(*ptr==';')
continue;

if(blockname&&!fInBlock)
{
if(*ptr++=='[')
{
if(!(endp=strchr(ptr,']')))
continue;
memcpy(block,ptr,endp-ptr);
block[endp-ptr]=NULL;
if(strcmpi(block,blockname))
continue;
else
{ fInBlock=TRUE;
continue;
}
}
else
continue;
}

if(fInBlock&&*ptr=='[')
return FALSE;

if(!(endp=strchr(ptr,'=')))
continue;

memcpy(temp,ptr,endp-ptr);
temp[endp-ptr]=NULL;
StrCutSpace(temp,item);

if( !strcmpi(itemname,item) )
{
DWORD remainder_offset = ftell(f);

DWORD item_offset = remainder_offset - strlen(linebuf);

fseek(f,item_offset,SEEK_SET);

if(itemtype==ITEM_LONG)
{ long arg = va_arg(p,long);
fprintf(f,"%s = %ld\r\n",itemname,arg);
}
else if(itemtype==ITEM_DWORD)
{ DWORD arg = va_arg(p,DWORD);
fprintf(f,"%s = 0x%08lX\r\n",itemname,arg);
}
else if(itemtype==ITEM_STRING)
{ char *arg = va_arg(p,char *);
fprintf(f,"%s = %s\r\n",itemname,arg);
}

fwrite(fbuf+remainder_offset,1,fsize-remainder_offset,f);

DWORD cur_offset = ftell(f);

if(cur_offset<fsize)
{
for(int i=0;i<fsize-cur_offset;i++)
fbuf[i]=NULL;

fwrite(fbuf,1,fsize-cur_offset,f);
}

va_end(p);
delete [] fbuf;
return TRUE;
}
}

va_end(p);
delete [] fbuf;
return FALSE;
}


BOOL SaveFile::DeleteItem(char *blockname,char *itemname)
{
if(fMode!=SAVE_MODIFY)
return FALSE;

char linebuf[FILE_COLUMN_MAX];
BOOL fInBlock=FALSE;
char *ptr,*endp,item[ITEM_NAME_MAX],block[ITEM_NAME_MAX],temp[FILE_COLUMN_MAX];

fseek(f,0,SEEK_END);

DWORD fsize = ftell(f);

BYTE far *fbuf = new BYTE far [fsize+0x100];

fseek(f,0,SEEK_SET);

BOOL rc = fread(fbuf,1,fsize,f);

if(!rc)
{
delete [] fbuf;
return FALSE;
}

fseek(f,0,SEEK_SET);

while( ptr=fgets(linebuf,FILE_COLUMN_MAX,f) )
{
while(*ptr==' '||*ptr=='\t')
ptr++;

if(*ptr==';')
continue;

if(blockname&&!fInBlock)
{
if(*ptr++=='[')
{
if(!(endp=strchr(ptr,']')))
continue;
memcpy(block,ptr,endp-ptr);
block[endp-ptr]=NULL;
if(strcmpi(block,blockname))
continue;
else
{ fInBlock=TRUE;
continue;
}
}
else
continue;
}

if(fInBlock&&*ptr=='[')
return FALSE;

if(!(endp=strchr(ptr,'=')))
continue;

memcpy(temp,ptr,endp-ptr);
temp[endp-ptr]=NULL;
StrCutSpace(temp,item);

if( !strcmpi(itemname,item) )
{
DWORD remainder_offset = ftell(f);

DWORD item_offset = remainder_offset - strlen(linebuf);

fseek(f,item_offset,SEEK_SET); //Seek to Item Location

fwrite(fbuf+remainder_offset,1,fsize-remainder_offset,f); //Write Remainder Content

DWORD cur_offset = ftell(f);

if(cur_offset<fsize)
{
for(int i=0;i<fsize-cur_offset;i++)
fbuf[i]=NULL;

fwrite(fbuf,1,fsize-cur_offset,f);
}

va_end(p);
delete [] fbuf;
return TRUE;
}
}

va_end(p);
delete [] fbuf;
return FALSE;
}

void SaveFile::AddLong(char *itemname,long data)
{
AddItem(itemname,ITEM_LONG,(long)data);
}

void SaveFile::AddDword(char *itemname,DWORD data)
{
AddItem(itemname,ITEM_DWORD,(DWORD)data);
}

void SaveFile::AddStr(char *itemname,char *data)
{
AddItem(itemname,ITEM_STRING,(char *)data);
}

void SaveFile::AddNote(char *note)
{
if(!note)
fprintf(f,"\r\n");
else
fprintf(f,"\r\n;%s\r\n",note);
}


BOOL SaveFile::ChangeLong(char *blockname,char *itemname,long NewData)
{
return ChangeItem(blockname,itemname,ITEM_LONG,NewData);
}

BOOL SaveFile::ChangeDword(char *blockname,char *itemname,DWORD NewData)
{
return ChangeItem(blockname,itemname,ITEM_DWORD,NewData);
}

BOOL SaveFile::ChangeStr(char *blockname,char *itemname,char far* NewData)
{
return ChangeItem(blockname,itemname,ITEM_STRING,NewData);
}

ironfox 2004-09-24
  • 打赏
  • 举报
回复
ini.h
======================
class SaveFile
{
public:

FILE *f;
char far file_name[50];
int fMode;

SaveFile(char *filename,int fmode=SAVE_NEW);
void AddBlock(char *blockname); //Add Block of Save File
void AddItem(char *itemname,int itemtype,...); //Add Item of Save File
void AddLong(char *itemname,long data);
void AddDword(char* itemname,DWORD data);
void AddStr(char* itemname,char *data);
void AddNote(char *note);
/*
Change the content of item . You must declare the SaveFile with SAVE_MODIFY
Parameter or YOU CAN NOT USE THIS FUNCTION.
*/
BOOL ChangeItem(char *blockname,char *itemname,int itemtype,...);
BOOL ChangeLong(char *blockname,char *itemname,long NewData);
BOOL ChangeDword(char *blockname,char *itemname,DWORD NewData);
BOOL ChangeStr(char *blockname,char *itemname,char far* NewData);

BOOL DeleteItem(char *blockname,char *itemname);

~SaveFile()
{ fclose(f);
}
};

class LoadFile
{
public:

FILE *f;

LoadFile(char *filename);
BOOL GetItem(char *blockname,char *itemname,int itemtype,...); //Get Item From File , If blockname=NULL => Get the First Match Item Name
BOOL GetLong(char *blockname,char *itemname,long *data);
BOOL GetDword(char *blockname,char* itemname,DWORD *data);
BOOL GetStr(char *blockname,char* itemname,char *data);
BOOL GetSwitchState(char *blockname,char *itemname,BOOL &fSwitch); //Get Switch Status (TRUE:1 or FALSE:0)

~LoadFile()
{ fclose(f);
}
};

pacman2000 2004-09-24
  • 打赏
  • 举报
回复
用C++的做起来简单一点。
daylove 2004-09-24
  • 打赏
  • 举报
回复
#include "StdAfx.h"
#include "fileini.h"
#include "stdio.h"


CFileini::CFileini()
{
Itemcount=0;
newcount=0;
Items=NULL;
ItemValues=NULL;
fp=NULL;
}

int CFileini::iniopen(char *FileName,int It)
{
int filelen=strlen(FileName);
if(filelen>512)filelen=512;
strncpy(inifilename,FileName,filelen);
inifilename[filelen]=0;


fp=fopen(FileName,"a+");
int i=0;
if(fp==NULL)return i;
i=1;
int fileeof=0,strsize=0;

char temp[200];
char Itemtemp[100];
char ItemValuetemp[100];


ItemValues=(char**)malloc(It*sizeof(char**));
Items=(char**)malloc(It*sizeof(char**));


for(int e=0;e<It;e++)
{
ItemValues[e]=NULL;
Items[e]=NULL;
}


char *ptemp=NULL;
while(Itemcount<It)
{
fileeof=fscanf(fp, "%s\n",temp);
if(fileeof==EOF)
{
i=2;
break;
}

char *temp1=strstr(temp,"=");
int rect=temp1-temp;
if(rect<0)continue;
strncpy(Itemtemp,temp,rect);
Itemtemp[rect]=0;

rect++;
int tv=0;

for(int i=rect;i<(int)strlen(temp)+1;i++)
{
ItemValuetemp[tv++]=temp[i];
}
ItemValuetemp[tv]=0;


strsize=strlen(Itemtemp)+1;
ptemp=(char*)malloc(strsize);
strcpy(ptemp,Itemtemp);
Items[Itemcount]=ptemp;


strsize=strlen(ItemValuetemp)+1;
ptemp=(char*)malloc(strsize);
strcpy(ptemp,ItemValuetemp);
ItemValues[Itemcount]=ptemp;

Itemcount++;
}
return i;
}



char* CFileini::iniread(char *Item)
{
int i=0;

if(Itemcount==0)return NULL;

while(strstr(Items[i],Item)==NULL)
{
i++;
if(i==Itemcount)return NULL;
}

return ItemValues[i];

}


CFileini::iniwrite(char *Item,char *ItemValue)
{


int strsize=strlen(Item)+1;
Items[Itemcount]=(char*)malloc(strsize);
strcpy(Items[Itemcount],Item);


strsize=strlen(ItemValue)+1;
ItemValues[Itemcount]=(char*)malloc(strsize);
strcpy(ItemValues[Itemcount],ItemValue);

Itemcount++;
newcount++;

// fprintf(fp,"%s=%s\n",Item,ItemValue);

}


CFileini::~CFileini()
{

if(fp!=NULL)fclose(fp);
DeleteFile(inifilename);
fp=fopen(inifilename,"a+");

fseek(fp,0,SEEK_SET);
for(int j=0;j<Itemcount;j++)
{
fprintf(fp,"%s=%s\n",Items[j],ItemValues[j]);
}



for(int i=0;i<Itemcount;i++)
{
if(Items[i]!=NULL){free(Items[i]);Items[i]=NULL;}
if(ItemValues[i]!=NULL){free(ItemValues[i]);ItemValues[i]=NULL;}
}
if(Items!=NULL){free(Items);Items=NULL;}
if(ItemValues!=NULL){free(ItemValues);ItemValues=NULL;}
if(fp!=NULL)fclose(fp);

}



char* CFileini::inimodify(char *Item,char *ItemValue)
{
int i=0;



if(Itemcount==0)return NULL;

while(strstr(Items[i],Item)==NULL)
{
i++;
if(i==Itemcount)return NULL;
}

free(ItemValues[i]);
int len=strlen(ItemValue)+1;
ItemValues[i]=(char*)malloc(len);
strcpy(ItemValues[i],ItemValue);

return ItemValues[i];

}
这个是c++的,改一下吧!
gladiatorcn 2004-09-24
  • 打赏
  • 举报
回复
我不知道gcc有没有提供现成的库,不过一般的配置文件都是通过自己实现的,可以使用比较简单的编译原理技术,其实直接使用lex和yacc就可以。
8thdetective 2004-09-24
  • 打赏
  • 举报
回复
???
daylove 2004-09-24
  • 打赏
  • 举报
回复
哦,错了
daylove 2004-09-24
  • 打赏
  • 举报
回复
//ini文件读写类
//共有3个函数可用.分别是
//iniopen(char FileName,int Itemcount) 打开或建立INI文件
//FileName:文件名 Itemcount:项个数(该个数必须大于文件中项目个数)
//char *iniread(char* Items) 读字段值
//Items:字段名 返回值:字段值
//iniwrite(char *Items,char *ItemValute) 写字段名和字段值
//Items:字段名 ItemValute:字段值
//inimodify(char *Items,char *ItemValute) 修改字段名和字段值
//Items:字段名 ItemValute:字段值
//方俊海 设计


class CFileini
{

public:

int iniopen(char *FileName,int It);
char* iniread(char *Item);
iniwrite(char *Item, char *ItemValue);
char* inimodify(char *Item,char *ItemValue);
CFileini();
~CFileini();

protected:
char inifilename[512];
char **Items;
char **ItemValues;
int Itemcount;
int newcount;
FILE *fp;
};

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧