📄 inifile.c
字号:
/*
* 文件名称: inifile.c
* 创建日期: 2006.5.14
* 文件描述: 读/写Ini文件。Ini文件的结构如下
* [section1]
item1 = value1
item2 = value2
[section2]
item1 = value1
item2 = value2
主要函数:
getiniitem(char * inifile,char* section,char *item1,char *value);
setiniitem(char * inifile,char * section,char *item1,char *value);
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "inifile.h"
#define INI_FILE_MAX_ROW 1024
int isbreakchar(char ch)
{
if(ch==9) //Tab Key
return 0;
if((ch<32)&&(ch>0))
return 1;
else
return 0;
}
int readline(FILE* fpt, char* linestr)
{
int i,rv;
char cc;
char buf[INI_FILE_MAX_ROW];
if(feof(fpt)){
return 1;
}
for(i=0;i<INI_FILE_MAX_ROW;i++){
rv=fread(&cc,1,1,fpt);
if(rv<1)
break;
if(isbreakchar(cc)==1)
break;
buf[i]=cc;
}
buf[i]='\0';
if(strlen(buf) == 0)
return 1;
strcpy(linestr,buf);
return 0;
}
int trimspace(char* ori,char * trim)
{
char *ptrsrc,*ptrdes;
ptrsrc = ori;
ptrdes = trim;
while(*ptrsrc != '\0')
{
if((*ptrsrc != ' ')&&(*ptrsrc!='\r'))
{
*ptrdes = *ptrsrc;
ptrdes++;
}
ptrsrc ++;
}
*ptrdes = '\0';
return 0;
}
int readitemfromline(char *line,char *item,char *value)
{
int i;
int tlen;
char linebuf[INI_FILE_MAX_ROW];
char *ptr;
ptr=line;
trimspace(ptr,linebuf);
tlen=strlen(linebuf);
for(i=0;i<tlen;i++)
{
if((linebuf[i]=='#')||(linebuf[i]==';'))
break;
}
if(i<2)
return 1;
linebuf[i]='\0';
ptr = strchr(linebuf,'=');
if(ptr == NULL)
return 1;
linebuf[(long)ptr-(long)linebuf] = '\0';
if(strcmp(item,linebuf)!=0)
return 1;
strcpy(value,ptr+1);
return 0;
}
int isfindsection(char *line,char *section)
{
char *ptr;
char linebuf[INI_FILE_MAX_ROW];
ptr = line;
trimspace(ptr,linebuf);
if(linebuf[0] != '[')
return 0;
if(strncmp(section,&linebuf[1],strlen(section))!=0)
return 0;
if(linebuf[1+strlen(section)] != ']')
return 0;
return 1;
}
int getiniitem(char * inifile,char* section,char *item,char *value)
{
FILE *fp;
int bOK;
char line[INI_FILE_MAX_ROW];
char linebuf[INI_FILE_MAX_ROW];
fp = fopen(inifile,"r");
if(fp == NULL)
{
printf("open file error");
return 1;
}
bOK = 0;
while(!readline(fp,line))
{
if(isfindsection(line,section))
{
bOK = 1;
break;
}
}
if(!bOK)
return 1;
bOK = 0;
while(!readline(fp,line))
{
trimspace(line,linebuf);
if(linebuf[0] == '[')//find '['
break;
if(readitemfromline(linebuf,item,value) == 0)
{
bOK = 1;
break;
}
}
fclose(fp);
return !bOK;
}
int setiniitem(char * inifile,char* section,char *item,char *value)
{
FILE *fp,*fptmp;
int bfindsection,bok;
char line[INI_FILE_MAX_ROW],line1[INI_FILE_MAX_ROW];
char valueold[INI_FILE_MAX_ROW];
if(access(inifile,0))//file not exist
{
fp = fopen(inifile,"w");
if(fp == NULL)
return 1;
fprintf(fp,"[%s]\n",section);
fprintf(fp,"%s=%s\n",item,value);
fclose(fp);
return 0;
}
//use tem file
fp = fopen(inifile,"r");
if(fp == NULL)
{
printf("open file for read error!");
return 1;
}
fptmp = fopen("inifile.tmp","w");
if(fptmp == NULL)
{
printf("open file for write error!");
return 1;
}
bfindsection = 0;//在此项目内
bok = 0;//已写入
while(!readline(fp,line))
{
trimspace(line,line1);
if(bok)
{
fprintf(fptmp,"%s\n",line);//
continue;
}
if(!bfindsection)
{
if(isfindsection(line1,section))
{
bfindsection = 1;
fprintf(fptmp,"%s\n",line);
continue;
}
else
{
fprintf(fptmp,"%s\n",line);
continue;
}
}
else
{
if(line1[0] != '[')//not end section
{
if(!readitemfromline(line1,item,valueold))//found the item
{
fprintf(fptmp,"%s=%s",item,value);//updata the item's new value
fprintf(fptmp,"%s\n",&line1[strlen(item)+1+strlen(valueold)]);
bok = 1;
continue;
}
else
{
fprintf(fptmp,"%s\n",line);
continue;
}
}
else//end of section
{
fprintf(fptmp,"%s=%s\n",item,value);//add new item
fprintf(fptmp,"%s\n",line);
bok = 1;
}
}
}//end while
if(!bok&&!bfindsection)//add new section
{
fprintf(fptmp,"[%s]\n",section);
fprintf(fptmp,"%s=%s\n",item,value);
}
if(!bok&&bfindsection)
{
fprintf(fptmp,"%s=%s\n",item,value);
}
fclose(fp);
fclose(fptmp);
remove(inifile);
rename("inifile.tmp",inifile);
return 0;
}
int getsection_num(char * inifile)
{
FILE *fp,*fptmp;
char line[INI_FILE_MAX_ROW];
int i = 0;
if(access(inifile,0))//file not exist
{
fp = fopen(inifile,"w");
if(fp == NULL)
return 0;
fclose(fp);
return 0;
}
//use tem file
fp = fopen(inifile,"r");
if(fp == NULL)
{
printf("open file for read error!");
return 0;
}
fptmp = fopen("inifile.tmp","w");
if(fptmp == NULL)
{
printf("open file for write error!");
return 0;
}
while(!feof(fp))
{
fgets(line,255,fp);
if(line[0] == '[')
i++;
}
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -