免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: attempt
打印 上一主题 下一主题

关于 C 语言中字符串替换的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-05-07 10:10 |只看该作者
你把文件改成:
SERVER_PORT= 21
SERVERNAME= TEST
LOGINUSER= test
PWD= test
MYSERVER_IP  = 127.0.0.1  
让MYSERVER_IP在最后一行,我的程序就可以工作了,否则你要把新ip写入原文件,定位就不好处理。。。


  1. /*
  2.     将一文件中的某个ip替换掉    by wzt
  3. */

  4. #include <stdio.h>
  5. #include <string.h>

  6. #define MAXLINE         1024
  7. #define MAXIP           20
  8. #define DEFAULT_FILE    "d:\\c\\6.txt"

  9. char old_ip[MAXIP];
  10. char new_ip[MAXIP];

  11. /* 将字符串"MYSERVER_IP  =  "保存到临时变量temp中 */
  12. void extract_data(char *line,char *temp)
  13. {
  14.     int     i = 0,j = 0,k = 0;

  15.     for ( ; line[i] != '=' ; i++ );
  16.     for ( ; line[i] != ' '; i++ );
  17.     for ( ; j <= i ; j++ )
  18.         temp[j] = line[j];
  19.     temp[j] = '\0';
  20.     printf("[+] %s\n",temp);
  21. }

  22. /* 检查输入ip合法性 */
  23. void check_ip(char *str)
  24. {
  25.     int i=0,count = 0;;

  26.     for ( ; i < strlen(str) ; i++ ) {
  27.         if ( !(str[i] >= '0' && str[i] <= '9' )) {
  28.             if ( str[i] == '.' ) {
  29.                 count++;
  30.                 continue;
  31.             }
  32.             printf("[-] Wrong IP.\n");
  33.             exit(0);
  34.         }
  35.     }

  36.     if (count == 3 )
  37.         printf("[+] IP check OK.\n");
  38.     else
  39.         printf("[-] Wrong IP.\n");

  40. }

  41. /* 替换ip */
  42. void load_file(FILE *s_fp)
  43. {
  44.     char    line[MAXLINE],new_line[MAXLINE],temp[MAXIP];
  45.     int     pos,len1,len2;
  46.     int     i = 0;

  47.     while ( fgets(line,MAXLINE,s_fp) != NULL ) {
  48.         if ( strstr(line,"MYSERVER_IP") != NULL ) {
  49.             extract_data(line,temp);
  50.             sprintf(new_line,"%s%s",temp,new_ip);
  51.             len1 = strlen(line);
  52.             len2 = strlen(new_line);
  53.             printf("[+] %s\n",line);
  54.             len1 = len1 - len2;
  55.             for ( ; i < len1 ; i++ )
  56.                 new_line[len2++] = ' ';
  57.             new_line[len2] = '\n';
  58.             new_line[len2 + 1] = '\0';
  59.             printf("[+] %s\n",new_line);
  60.             pos = strlen(line);
  61.             fseek(s_fp,-pos,SEEK_CUR);
  62.             fputs(new_line,s_fp);
  63.             break;
  64.         }
  65.     }
  66. }

  67. int main(int argc,char **argv)
  68. {
  69.     FILE    *s_fp;

  70.     printf("[+] input your ip : ");
  71.     scanf("%s",new_ip);
  72.     printf("[+] new_ip : %s\n",new_ip);
  73.     check_ip(new_ip);
  74.     if ( (s_fp = fopen(DEFAULT_FILE,"r+")) == NULL ) {
  75.         printf("[-] open %s failed.\n",argv[1]);
  76.         exit(0);
  77.     }

  78.     load_file(s_fp);
  79.     fclose(s_fp);

  80.     printf("[+] done.\n");

  81.     return 0;
  82. }
复制代码

[ 本帖最后由 W.Z.T 于 2007-5-7 10:13 编辑 ]

论坛徽章:
0
22 [报告]
发表于 2007-05-07 10:20 |只看该作者
原帖由 W.Z.T 于 2007-5-7 10:10 发表
你把文件改成:
SERVER_PORT= 21
SERVERNAME= TEST
LOGINUSER= test
PWD= test
MYSERVER_IP  = 127.0.0.1  
让MYSERVER_IP在最后一行,我的程序就可以工作了,否则你要把新ip写入原文件,定位就不好处理。。 ...

你的方法有一个致命问题,fopen是Stream操作方式,操作系统对Stream有缓存,你再用fseek,不见得能定位到文件的正确位置,而且后面的fgets都有问题了.

象你这样用,不能用stream方式,必须直接用write,read,lseek等直接文件读取,才能正常工作.但是很复杂.用Stream方式,都是先产生一个临时文件,在覆盖旧的.

论坛徽章:
0
23 [报告]
发表于 2007-05-07 10:34 |只看该作者
lz要的程序是写回原文件!你还没看清吗?我当然知道这些问题了。。我的程序在试图在怎么解决那些问题,而你的程序是在怎么回避那些问题,对吗?将新字符串写到新文件是多么简单的问题,按照flw2的流程就可以了。

麻烦楼上的运行下我的新程序,看看可否完成lz的要求,谢谢

论坛徽章:
0
24 [报告]
发表于 2007-05-07 10:42 |只看该作者
原帖由 W.Z.T 于 2007-5-7 10:34 发表
lz要的程序是写回原文件!你还没看清吗?我当然知道这些问题了。。我的程序在试图在怎么解决那些问题,而你的程序是在怎么回避那些问题,对吗?将新字符串写到新文件是多么简单的问题,按照flw2的流程就可以了。
...

写程序都是用尽量最简单的方法,完成任务. 我的方法不是回避问题,而是能一样达到目的.

把简单搞得复杂,以及玩弄技巧,都不是好的习惯. 将来别人维护这些代码,都要累死了.

论坛徽章:
0
25 [报告]
发表于 2007-05-07 12:05 |只看该作者
通常是用另一个文件,然后rename.

配置文件一般不会有一万行。

论坛徽章:
0
26 [报告]
发表于 2007-05-07 12:13 |只看该作者
to cxu123,

我没有细看楼上的程序。但是你说的致命问题,存在吗?
fseek可以定位到正确位置。

还有文件的缓寸,操作系统的缓存fread, 和read都有。


原帖由 cxu123 于 2007-5-7 10:20 发表

你的方法有一个致命问题,fopen是Stream操作方式,操作系统对Stream有缓存,你再用fseek,不见得能定位到文件的正确位置,而且后面的fgets都有问题了.

象你这样用,不能用stream方式,必须直接用write,read,lseek等 ...

论坛徽章:
0
27 [报告]
发表于 2007-05-07 13:27 |只看该作者
mark一下

论坛徽章:
0
28 [报告]
发表于 2007-05-07 17:36 |只看该作者
原帖由 cxu123 于 2007-5-7 10:42 发表

写程序都是用尽量最简单的方法,完成任务. 我的方法不是回避问题,而是能一样达到目的.

把简单搞得复杂,以及玩弄技巧,都不是好的习惯. 将来别人维护这些代码,都要累死了.


兄弟,人家楼主是要把新ip写入原文件,不是建立新文件,ok?

我们当然要lz的意思写程序了,如果要用最简单的方法,肯定不让写会原文件了。。。

论坛徽章:
0
29 [报告]
发表于 2007-05-07 19:54 |只看该作者
原帖由 思一克 于 2007-5-7 12:13 发表
to cxu123,

我没有细看楼上的程序。但是你说的致命问题,存在吗?
fseek可以定位到正确位置。

还有文件的缓寸,操作系统的缓存fread, 和read都有。



我的意思是流(STREAM)缓存, 直接在STREAM上修改内容,再定位指针到STREAM的正确位置,虽然不一定是做不到,但是就不容易了.

操作系统文件缓存都有,但操作系统能保证文件指针正确定位. 就算直接用比较底层的write,read,seek,直接在文件上修改也是很复杂的事情. 不信你可以自己试试,文件指针定位很搞的.

这么简单的问题,搞得那么复杂,没有必要. 又不是数据库,非要直接在文件上修改,连Word都是生成临时文件,然后覆盖旧的.

[ 本帖最后由 cxu123 于 2007-5-7 20:11 编辑 ]

论坛徽章:
0
30 [报告]
发表于 2007-05-07 20:45 |只看该作者
楼上的,我服你了

我在强调,没有按照简单的方法来处理,是因为lz要写回原文件,ok了吧?

不要把问题的方向搞偏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP