夕烦D 发表于 2016-09-17 11:49

写了一个读取写入配置文件的函数,请大家帮小弟看看有什么问题。谢谢~~~

正在学C操作文件部分,写了一个配置文件的读取写入函数,其中可能有问题,请大家提提建议,或者怎么优化这个函数。。谢谢:D)
配置文件的格式为:key=value,中间没有空格的。
函数中,key的长度为10,value的长度为100,没进行溢出的判断。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void DeleteFile();
int WrtCfgIterm(char *pfile/*in*/, char *key/*in*/, char *valude/*in*/);
int GetCfgIterm();
void interface();
int CreateFile();


int main()
{
                interface();
                return 0;
}

//interface
void interface()
{
                int SelectNum = 0;
                char FileName;//文件名字
                char NewFileName;//新文件名字
                char Key;
                char valude;
                char N = '\0';//接收判断结果
                FileName = '\0';
                NewFileName = '\0';
                Key = '\0';
                valude = '\0';
                while(1)
                {
                printf("1. 创建配置文件\n");
                printf("2. 读配置文件\n");
                printf("3. 写配置文件\n");
                printf("4. 删除配置文件\n");
                printf("5. 退出\n");

                scanf("%d", &SelectNum);
               
                switch(SelectNum)
                {
                                case 1:{
                                                           printf("请输入文件名称:\n");
                                                           scanf("%s", FileName);
                                                           if(CreateFile(FileName))
                                                                           printf("create successful!\n");
                                           }break;
                                case 2:{
                                                           if(FileName != '\0')
                                                           {
                                                                           printf("操作文件为:%s? Y/N \n", FileName);
                                                                        scanf("%s", &N);
                                                                        if(N == 'Y' || N == 'y')
                                                                        {
                                                                                        printf("请输入查询的KEY:\n");
                                                                                        scanf("%s", Key);
                                                                                        if(        GetCfgIterm(FileName/*in*/, Key/*in*/, valude/*out*/))
                                                                                                                        printf("value:%s\n", valude);
                                                                                        else
                                                                                                                        printf("do not get Iterm\n");
                                                                        }
                                                                        else
                                                                        {
                                                                           printf("请输入打开文件名称:\n");
                                                                           scanf("%s", NewFileName);
                                                                           printf("请输入查询的KEY:\n");
                                                                           scanf("%s", Key);
                                                                           printf("file name : %s\n", NewFileName);
                                                                           if(GetCfgIterm(NewFileName/*in*/, Key/*in*/, valude/*out*/))
                                                                                           printf("value:%s\n", valude);
                                                                           else
                                                                                           printf("do not get Iterm\n");
                                                                        }
                                                           }
                                                           else
                                                           {
                                                                           printf("请输入文件名称:\n");
                                                                           scanf("%s", NewFileName);
                                                                           printf("请输入查询的KEY:\n");
                                                                           scanf("%s", Key);
                                                                           printf("file name : %s\n", NewFileName);
                                                                           if(GetCfgIterm(NewFileName/*in*/, Key/*in*/, valude/*out*/))
                                                                                           printf("value:%s\n", valude);
                                                                           else
                                                                                           printf("do not get Iterm\n");
                                                           }

                                           }break;
                                case 3:{
                                                           if(FileName != '\0')
                                                           {
                                                                           printf("操作文件为:%s? Y/N \n", FileName);
                                                                        scanf("%s", &N);
                                                                        if(N == 'Y' || N == 'y')
                                                                        {
                                                                                        printf("请输入写入的KEY:\n");
                                                                                        scanf("%s", Key);
                                                                                        printf("请输入写入的Value:\n");
                                                                                        scanf("%s", valude);
                                                                                        if(WrtCfgIterm(FileName/*in*/, Key/*in*/, valude/*in*/))
                                                                                                        printf("value=%s\n", valude);
                                                                                        else
                                                                                                        printf("write failed!\n");
                                                                        }
                                                                        else
                                                                        {
                                                                           printf("请输入打开文件名称:\n");
                                                                           scanf("%s", NewFileName);
                                                                           printf("请输入写入的KEY:\n");
                                                                           scanf("%s", Key);
                                                                           printf("请输入写入的Value:\n");
                                                                           scanf("%s", valude);

                                                                           if(WrtCfgIterm(NewFileName/*in*/, Key/*in*/, valude/*in*/))
                                                                                           printf("value=%s\n", valude);
                                                                           else
                                                                                           printf("write failed!\n");

                                                                        }
                                                           }
                                                           else
                                                           {
                                                                           printf("请输入文件名称:\n");
                                                                           scanf("%s", NewFileName);
                                                                           printf("请输入写入的KEY:\n");
                                                                           scanf("%s", Key);
                                                                           printf("请输入写入的Value:\n");
                                                                           scanf("%s", valude);

                                                                           if(WrtCfgIterm(NewFileName/*in*/, Key/*in*/, valude/*in*/))
                                                                                           printf("\nvalue=%s\n", valude);
                                                                           else
                                                                                           printf("write failed!\n");
                                                           }


                                           }break;
                                case 4:{
                                                           if(FileName != '\0')
                                                           {
                                                                           printf("操作文件为:%s? Y/N \n", FileName);
                                                                        scanf("%s", &N);
                                                                        if(N == 'Y' || N == 'y')
                                                                        {
                                                                           DeleteFile(FileName);
                                                                        }
                                                           }
                                                           else
                                                           {
                                                                           printf("请输入文件名称:\n");
                                                                           scanf("%s", NewFileName);
                                                                           DeleteFile(NewFileName);
                                                           }

                                                       
                                           }break;
                                case 5:{
                                                           exit(0);
                                           }break;

                }
                }
}

//facution

int CreateFile(char *FileName)/*创建文件*/
{
                FILE *fp;
                if((fp = fopen(FileName, "w")) == NULL)
                {
                                printf("create new file failed!\n");
                                exit(0);
                }
                fclose(fp);
                return 1;
}
void DeleteFile(char *FileName)/*删除文件*/
{
                if(remove(FileName))
                {
                                printf("Could not delete the file %s \n",FileName);
                }
                else
                {
                                printf("Delete file successful! \n");
                }
}

int GetCfgIterm(char *pfile/*in*/, char *key/*in*/, char *valude/*out*/)/*读配置文件*/
{
                int i = 0, k = 0, j = 0;
                FILE *fp;
                char *p;
                char LineKey;
                char LineIterm;
                fp = fopen(pfile, "r");
                if(fp == NULL)
                {
                                printf("open file failed!\n");
                                fclose(fp);
                                exit(0);
                }
                else
                                printf("open file successful!\n");
                for(i = 0; ; i++)//循环读取每行
                {
                                if((fgets(LineIterm, 100, fp)) == NULL)//读取每行的字符串
                                {
                                                fclose(fp);
                                                break;
                                }
                                p = LineIterm;//利用p移动得到LineTterm字符串每个字符。LineIterm不能移动。
                                k = 0;
                                while(*p != '=')//得到每行字符串中的key的字符串
                                {
                                                LineKey = *p;
                                                k++;
                                                p++;
                                }
                                LineKey = '\0';//key的字符串末尾补\0
                                if(strcmp(LineKey, key) == 0)//判断每行的key和形参的key是否相等
                                {
                                                p++;//越过字符‘=’
                                                j = 0;
                                                while(*p != '\0')//从每行字符串中得到valude
                                                {
                                                                valude = *p;
                                                                j++;
                                                                p++;
                                                }
                                                valude = '\0';//value字符串末尾补‘\0’
                                                fclose(fp);
                                                return 1;
                                }
                }
                fclose(fp);
                return 0;
}

int WrtCfgIterm(char *pfile/*in*/, char *key/*in*/, char *valude/*in*/)/*写配置文件*/
{
                int i = 0, k = 0, j = 0;
                FILE *fp;
                char LineIterm;
                fp = fopen(pfile, "a");
                if(fp == NULL)
                {
                                printf("open file failed!\n");
                                fclose(fp);
                                exit(0);
                }
                k = 0;
                while(key != '\0')//形参的key付给行字符串的前面。
                {
                                LineIterm = key;
                                k++;
                }
                LineIterm = '=';//行字符串后面补上’=‘
                k++;
                j = 0;
                while(valude != '\0')//形参的value赋值给行字符串的后面。
                {
                                LineIterm = valude;
                                j++;
                                k++;
                }
                LineIterm = '\n';//行字符串补全换行符
                k++;
                LineIterm = '\0';//行字符串末尾补’\0‘
                if(fputs(LineIterm, fp) > 0)
                                printf("wtrite successful!\n");
                fclose(fp);
                return 1;
}

scounixadmin 发表于 2016-09-17 15:46

如果写配置是要“修改已有的配置”呢?
比如
serverip=192.168.4.30修改成serverip=10.10.10.10

夕烦D 发表于 2016-09-17 18:19

回复 2# scounixadmin

忘添加这个了:oops:,,,一会添加之后发上来。

scounixadmin 发表于 2016-09-17 19:31

不知道什么是结构化编程,代码质量也一般,应该是个新手

夕烦D 发表于 2016-09-17 21:57

回复 2# scounixadmin

遇到点问题,,没办法改存在key对应的value,,,有两种方法解决,但是都存在问题方法1;fseek查找到改字符串位置,然后改,但是不能确定key所在的位置。
方法2:复制文件1到文件2,然后把文件1删除,改文件2名为文件1,,,在复制的时候改掉字符串。。。。感觉好费劲。

夕烦D 发表于 2016-09-17 21:59

回复 4# scounixadmin

额,是正在学习,哈哈,,,,能给点意见吗?

scounixadmin 发表于 2016-09-18 11:48

呵呵,有点进步了
实际上类似数据表的操作:add, del, update. 并且每次操作还要保证key值的唯一性,以及容错性。确实比较麻烦。
一般如果利用你这种情况,都是通过编辑工具(vi)把文件配置好,程序只是读取而已,

夕烦D 发表于 2016-09-18 17:26

回复 7# scounixadmin

linux内核的配置文件生成,每次update,都重新写一个吗?

scounixadmin 发表于 2016-09-19 11:48

回复 8# 夕烦D

虽然没研究过,但应该是根据用户配置重新生成一个文件(原配置文件内容清零后写入)。一般当你的参数需要动态修改(程序根据修改)的话,建议二进制的形式配置
如果是静态修改(手工修改后重新启动程序),建议用文本形式
页: [1]
查看完整版本: 写了一个读取写入配置文件的函数,请大家帮小弟看看有什么问题。谢谢~~~