写了一个读取写入配置文件的函数,请大家帮小弟看看有什么问题。谢谢~~~
正在学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;
}
如果写配置是要“修改已有的配置”呢?
比如
serverip=192.168.4.30修改成serverip=10.10.10.10 回复 2# scounixadmin
忘添加这个了:oops:,,,一会添加之后发上来。 不知道什么是结构化编程,代码质量也一般,应该是个新手 回复 2# scounixadmin
遇到点问题,,没办法改存在key对应的value,,,有两种方法解决,但是都存在问题方法1;fseek查找到改字符串位置,然后改,但是不能确定key所在的位置。
方法2:复制文件1到文件2,然后把文件1删除,改文件2名为文件1,,,在复制的时候改掉字符串。。。。感觉好费劲。
回复 4# scounixadmin
额,是正在学习,哈哈,,,,能给点意见吗? 呵呵,有点进步了
实际上类似数据表的操作:add, del, update. 并且每次操作还要保证key值的唯一性,以及容错性。确实比较麻烦。
一般如果利用你这种情况,都是通过编辑工具(vi)把文件配置好,程序只是读取而已, 回复 7# scounixadmin
linux内核的配置文件生成,每次update,都重新写一个吗? 回复 8# 夕烦D
虽然没研究过,但应该是根据用户配置重新生成一个文件(原配置文件内容清零后写入)。一般当你的参数需要动态修改(程序根据修改)的话,建议二进制的形式配置
如果是静态修改(手工修改后重新启动程序),建议用文本形式
页:
[1]