免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 6891 | 回复: 33
打印 上一主题 下一主题

近期写的一段代码-----请大家给评论下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-30 10:01 |只看该作者 |倒序浏览
将一个文件中指定的字符串替换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char * argv[] )
{
    FILE * fp, *fp1;
    char datep[10];
    char buffer[500][500];
    char base[] = "Item23";  //需替换的部分字符串
    char temp[] = "Item23=DrawVariable(14,33,隶书,18,2,1,8,25,3)\n"; //要替换的内容
    char * ptr, *dp;
    int i, j, jishu;

    if ( ( fp1 = fopen( "C:\\windows\\system32\\printconfig2.dll", "r" ) ) == NULL ) {
        printf( "打印文件不存在,请联系信息中心...\n" );
        getchar();
        return 0;
    }
    else {
            i = 0;
            while ( !feof( fp1 ) ) {
                fgets( buffer[i], 150, fp1 ); //读取一行内容
               
               if (  strncmp( buffer[i], base, 6 ) == 0 ) {//查找需替换的位置并替换
                     for ( j = 0; buffer[i][j] != '\0'; j++ )
                         buffer[i][j] = temp[j];
                }
            /*    printf( "%d %s", i, buffer );  */
                 i++;
                 jishu = i;
            }   
            
    }
    if ( ( fp = fopen( "C:\\windows\\system32\\printconfig.dll", "w" ) ) == NULL ) {
        printf( "打印文件不存在,请联系信息中心...\n" );
    }
    else {
             for ( i = 0; i < jishu; i++ ) {
                    fputs( buffer[i], fp );                    
            }
            fclose( fp1 );           
            fclose( fp );
            printf( "\n\n已经修改完毕,日期已被还原为系统默认\n" );
    }            
   
    getchar();
    return 0;   
}


目前程序运行良好



[ 本帖最后由 ngzyl 于 2007-8-30 14:38 编辑 ]

7.png (17.69 KB, 下载次数: 100)

7.png

论坛徽章:
0
2 [报告]
发表于 2007-08-30 10:07 |只看该作者
哥们,用下[code][/code]包起来吧

论坛徽章:
0
3 [报告]
发表于 2007-08-30 10:12 |只看该作者

回复 #2 cugb_cat 的帖子

嘿嘿,这样好了吧!

论坛徽章:
0
4 [报告]
发表于 2007-08-30 10:18 |只看该作者
feof的用法似乎不正确呀


原帖由 ngzyl 于 2007-8-30 10:01 发表
#include
#include
#include

int main( int argc, char * argv[] )
{
    FILE * fp, *fp1;
    char datep[10];
    char buffer[500][500];
    char base[] = "Item23";
    /* char c1[] = " ...

论坛徽章:
0
5 [报告]
发表于 2007-08-30 10:26 |只看该作者
注释掉的大段代码请去掉吧。

BTW:你不简单介绍下,没人有工夫仔细看你在干嘛

论坛徽章:
0
6 [报告]
发表于 2007-08-30 10:26 |只看该作者
这一段是不是改成这样更好点呢

原文:

  1. if (  strncmp( buffer[i], base, 6 ) == 0 )
  2. {
  3.                                          for ( j = 0; buffer[i][j] != '\0'; j++ )
  4.                                                  buffer[i][j] = temp[j];
  5. }
复制代码


修改:

  1. if (  strncmp( buffer[i], base, 6 ) == 0 )
  2. {
  3.         memset( buffer[i],0x00,sizeof(buffer[i]) );
  4.         for ( j = 0; temp[j] != '\0'; j++ )
  5.                 buffer[i][j] = temp[j];
  6. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2007-08-30 11:04 |只看该作者

回复 #6 OVERAGAIN 的帖子

感谢指教

论坛徽章:
0
8 [报告]
发表于 2007-08-30 13:32 |只看该作者
感觉这样实现不太好

为什么不逐个读入字符,同时顺序输入到另外的文本中去呢?
碰到I,下一次就多些,查找目标串,如果找到,则替代输出。

论坛徽章:
0
9 [报告]
发表于 2007-08-30 14:41 |只看该作者

回复 #8 drowsyboy 的帖子

你这样不是需要更多的时间?

论坛徽章:
0
10 [报告]
发表于 2007-08-30 15:18 |只看该作者
一堆的问题:
1. base和temp,常量字符串,为什么不加const ?
2. fp如打开失败,会不关闭fp1
3. fgets( buffer, 150, fp1 ),这里长度150, 前面声明的buffer是500
4. strncmp( buffer, base, 6 ), 这里默认base的长度就是6了,造成后期维护问题,不如用strlen
5. char buffer[500][500];,局部数组有250K, 某些系统上足够造成栈溢出了!!
6.  for ( j = 0; buffer[j] != '\0'; j++ )
                         buffer[j] = temp[j];
    达不到完全替换的效果,长度被buffer[j]限制住了
7. 如果是dll,需要用wb或rb打开文件,否则如果是文本文件,骗谁啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP