C语言实现文件字符替换_文件中的字符替换代码c-程序员宅基地

技术标签: Linux C编程  

C语言标准路为我们提供了文件操作函数:

包含:fopen()/fclose()          //文件打开与关闭函数;(参数与返回类型省略)

            fgetc()/fputc()             //从流中获取字符,向文件流中写入字符;

            getc()/putc()               //与fgetc()/fputc()等价,不同的是,当getc()/putc()定义为宏时,可能多次计算stream的值;

            getchar()/putchar()    //与上述两种类似;

            ungetc()                     //将字符转化为unsigned char 类型写回到流中;

            fscanf()/fprintf()         //用于文件的格式化输入输出;

            fread()/fwrite()           //从流中读/写特定数目的特定单位大小的对象;

            fgets()/fputs()             //从文件流中获取字符串,或将字符串写入流中;       

其中char* fgets(char*s,int size,FILE*fp)最多将size-1个字符读入s中,s的第size个存储空间保留‘\0’,因而s中保留的为字符串,对于文件,如遇到换行符,读取结束。即:当size大于文件一行的字符数时,fgets()运行一次读取文件中的一行,否则,一次读取特定数目的字符。(在实际中,当s由动态分配获得时,读取失败  ,只能采取静态分配这是为什么,求解?)。

          文件定位函数:

          int fseek(FILE*stream,long offset,int orign)

          对于二进制流,被设置为origin开始的第offset个字符处,origin:SEEK_SET,SEEK_CUR,SEEK_END;

          对于文本流,offset必须设置为0,获是ftell()的返回值(此时origin必须设置为SEEK_SET;

          int ftell(FILE*stream)   //返回stream流的当前文件位置;  

          void rewind()               //即:fseek(fp,0L,SEEK_SET);clearerr(fp);

          int fgetpos(FILE*stream,fpos_t *ptr)    //获取流的当前位置,记录在*ptr中

          int fsetpos(FILE*stream,const fpos_t *ptr)    //将流的当前位置设置为*ptr中的位置    

         int feof(fp)  文件是否到文件结束符,若是,则返回非0值,否则返回0。

例子:从文件name1中查找字符串,并替换为另一个字符串,结果保存在name2文件中

1、替换字符串中的特定字符串

  1. void Substitute(char *pInput, char *pOutput, char *pSrc, char *pDst)  
  2. {  
  3.   char    *pi, *po, *p;  
  4.   int     nSrcLen, nDstLen, nLen;  
  5.   
  6.   // 指向输入字符串的游动指针.  
  7.   pi = pInput;      
  8.   // 指向输出字符串的游动指针.  
  9.   po = pOutput;  
  10.   // 计算被替换串和替换串的长度.  
  11.   nSrcLen = strlen(pSrc);  
  12.   nDstLen = strlen(pDst);  
  13.   
  14.   // 查找pi指向字符串中第一次出现替换串的位置,并返回指针(找不到则返回null).     
  15.   p = strstr(pi, pSrc);  
  16.   if(p)  
  17.   {  
  18.           // 找到.  
  19.       while(p)  
  20.       {  
  21.           //计算被替换串前边字符串的长度.  
  22.           nLen = (int)(p - pi);  
  23.           // 复制到输出字符串.  
  24.           memcpy(po, pi, nLen);  
  25.           memcpy(po + nLen, pDst, nDstLen);  
  26.           // 跳过被替换串.  
  27.           pi = p + nSrcLen;  
  28.           // 调整指向输出串的指针位置.  
  29.           po = po + nLen + nDstLen;  
  30.           // 继续查找.  
  31.           p = strstr(pi, pSrc);  
  32.       }  
  33.       // 复制剩余字符串.  
  34.       strcpy(po, pi);  
  35.   }  
  36.   else  
  37.   {  
  38.       // 没有找到则原样复制.  
  39.       strcpy(po, pi);  
  40.   }  
  41. }  
测试程序:
  1. int main()  
  2. {     
  3.     FILE *fpSrc,*fpDes;  
  4.     char filename1[20]="ding1.txt";  
  5.     char filename2[20]="ding2.txt";  
  6.     //要求查找的字符串,替换的字符串;  
  7.     char ps[]="computer";  
  8.         char pd[]="basketballs";  
  9.     //求取所查找和替换的字符串的长度;  
  10.         int len_src=strlen(ps);  
  11.     int len_des=strlen(pd);  
  12.     //定义存储字符串缓冲区;很奇怪的一点是,fgets函数不能将字符串写入动态分配的内存中  
  13.     /*char* Src_buf=(char*)(sizeof(char)*MAXSIZES); 
  14.      char* Cpy_buf=(char*)(sizeof(char)*MAXSIZES); 
  15.          char* Des_buf=(char*)(sizeof(char)*MAXSIZES);*/  
  16.     char Src_buf[MAXSIZES];  
  17.     char Cpy_buf[MAXSIZES];  
  18.         char Des_buf[MAXSIZES];  
  19.         //打开文件  
  20.     if((fpSrc=fopen(filename1,"r+"))==NULL)  
  21.     {  
  22.         printf("fail to open the file1 !\n");  
  23.        exit(1);   
  24.     }  
  25.     if((fpDes=fopen(filename2,"a+"))==NULL)  
  26.     {  
  27.         printf("fail to open the file2 !\n");  
  28.         exit(1);  
  29.     }  
  30.     //进行循环读取  
  31.     while(!feof(fpSrc))//判断文件是否已结束;!feof(fpSrc)  
  32.     {  
  33.         fgets(Src_buf,MAXSIZES,fpSrc);  
  34.         Substitute(Src_buf,Des_buf,ps,pd);  
  35.         fputs(Des_buf,fpDes);  
  36.         printf("%s",Des_buf);  
  37.     }  
  38.     fclose(fpSrc);  
  39.     fclose(fpDes);  
  40.   
  41.     system("pause");  
  42.     return 0;  

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lee244868149/article/details/45540097

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签