⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inifile.c

📁 一个电话本的程序
💻 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 + -