修改配置文件内容算法,急用,高分送!

DarkBlue5 2006-02-22 11:43:40
想了一天了,现在急用,恨不得长出八只手来,请过客多指点!!!!

一个Linux的配置文件test.conf,内容如下:

-----------------------------------------

#!/bin/sh
#

key1=111
key2=222
key3=333
key4=444

---------------------------------------------

用标准C实现将位于磁盘中的文件test.conf中test2后的键值改为比如12344( 比原来键值长 )或12( 比原来键值短 )而不影响格式,变为如下形式

----------------------------------------

#!/bin/sh
#

key1=111
key2=222
key3=333
key4=444

-----------------------------------------

我现在的问题是无法解决新键值与原有键值长度不一致时导致的覆盖后继字符问题或是相反的不能完全修改问题,比如变成

key1=12345
y2=222 (覆盖了)

或是

key2=121 (没改全)

请指点一下,我好急呀!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...全文
218 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
DarkBlue5 2006-02-23
  • 打赏
  • 举报
回复
郁郁思扬,

多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!
多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!多谢!
DarkBlue5 2006-02-22
  • 打赏
  • 举报
回复
楼上那位,你说的方法是不是用mmap <sys/mman.h>?
可不可以用ANSI C实现?

如果可以能不能细说一下大概的用法??
奥爸 2006-02-22
  • 打赏
  • 举报
回复
放到map中,查找要修改的key,然后在修改 ,在把map保存成一个文件,方法比较笨
DarkBlue5 2006-02-22
  • 打赏
  • 举报
回复
是不是只有这个方法,我现在看到几个也是这样,

大至就是定义一个结构,结构中一个是键名一个是键值,然后修改相关结构后再写进去,

有没有其它的办法?
MarcoCC 2006-02-22
  • 打赏
  • 举报
回复
直接写文件我觉得是不行的,可以先将文件的内容全部读到buffer中,然后根据回车换行符进行修改,改完后再重新写入文件
DarkBlue5 2006-02-22
  • 打赏
  • 举报
回复
不好意思,修改后的文件写错了,其实就是把某个键值更改,
比如将第三行key3的键值改为1234

key3=1234
jinjiajie 2006-02-22
  • 打赏
  • 举报
回复
试试一行一行读写吧....
du51 2006-02-22
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void make(char *name,char *key,char *value)
{
FILE *fin,*fout;
char temp[81],*ptr,**file;
int i=0,j;
fin=fopen(name,"r");
while(fgets(temp,80,fin))i++;
rewind(fin);
if(!(file=(char**)malloc(sizeof(char*)*i)))exit(1);
for(j=0;j<i;j++)
if(!(file[j]=(char*)malloc(sizeof(char)*81)))exit(1);
j=0;
while(j<i)
{
fgets(temp,81,fin);
if(ptr=strstr(temp,key))
{
*(ptr+strlen(key)+1)=0;
strcat(temp,value);
strcat(temp,"\n");
}
strcpy(file[j++],temp);
}
fclose(fin);
fout=fopen(name,"w");
j=0;
while(j<i)fputs(file[j++],fout);
fclose(fout);
j=0;
while(j<i)free(file[j++]);
}
int main()
{
char *name="test.conf",*key="key2",*value="123456789";
make(name,key,value);
return 0;
}

/*原test.conf文件
#!/bin/sh
#

key1=111
key2=222
key3=333
key4=444
*/
/*运行后
#!/bin/sh
#

key1=111
key2=123456789
key3=333
key4=444
*/

du51 2006-02-22
  • 打赏
  • 举报
回复
你可以读出来存在一个地方(比如二维数组)改,改后写回.
tonyMCM 2006-02-22
  • 打赏
  • 举报
回复
mark 扽

69,384

社区成员

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

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