在C语言里在一个文件里搜索一个字符串并进行修改

比如说,我打开一个文件,修改其中的一个字符串叫做data为_data,如何进行修改?(文件名为data.txt)... 比如说,我打开一个文件,修改其中的一个字符串叫做data为_data,如何进行修改?(文件名为data.txt) 展开
 我来答
星月小木木
推荐于2018-03-23 · TA获得超过3.2万个赞
知道大有可为答主
回答量:2.4万
采纳率:0%
帮助的人:1.1亿
展开全部
  #include<stdio.h>
  #include<conio.h>
  #include<string.h>
  #include<stdlib.h>
  void Substitute(char *pInput, char *pOutput, char *pSrc, char *pDst)
  {
  char *pi, *po, *p;
  int nSrcLen, nDstLen, nLen;
  // 指向输入字符串的游动指针.
  pi = pInput;
  // 指向输出字符串的游动指针.
  po = pOutput;
  // 计算被替换串和替换串的长度.
  nSrcLen = strlen(pSrc);
  nDstLen = strlen(pDst);
  // 查找pi指向字符串中第一次出现替换串的位置,并返回指针(找不到则返回null).
  p = strstr(pi, pSrc);
  if(p)
  {
  // 找到.
  while(p)
  {
  //计算被替换串前边字符串的长度.
  nLen = (int)(p - pi);
  // 复制到输出字符串.
  memcpy(po, pi, nLen);
  memcpy(po + nLen, pDst, nDstLen);
  // 跳过被替换串.
  pi = p + nSrcLen;
  // 调整指向输出串的指针位置.
  po = po + nLen + nDstLen;
  // 继续查找.
  p = strstr(pi, pSrc);
  }
  // 复制剩余字符串.
  strcpy(po, pi);
  }
  else
  {
  // 没有找到则原样复制.
  strcpy(po, pi);
  }
  }
  int main(int ac, char *av[])
  {
  if (ac!=5) {
  printf("程序名 要操作的文件 新文件 查找的字符串 替换的字符串\n");
  printf("示例:test.exe 1.txt 2.txt hello love\n");
  return 0;
  }
  const int MAXSIZES = 100;
  FILE *fpSrc,*fpDes;
  char filename1[20]="1.txt";
  char filename2[20]="2.txt";
  //要求查找的字符串,替换的字符串;
  char ps[]="hello";
  char pd[]="love";
  //求取所查找和替换的字符串的长度;
  int len_src=strlen(av[3]);
  int len_des=strlen(av[4]);
  //定义存储字符串缓冲区;很奇怪的一点是,fgets函数不能将字符串写入动态分配的内存中
  /*char* Src_buf=(char*)(sizeof(char)*MAXSIZES);
  char* Cpy_buf=(char*)(sizeof(char)*MAXSIZES);
  char* Des_buf=(char*)(sizeof(char)*MAXSIZES);*/
  char Src_buf[MAXSIZES] = {0};
  char Cpy_buf[MAXSIZES] = {0};
  char Des_buf[MAXSIZES] = {0};
  //打开文件
  if((fpSrc=fopen(av[1],"r+"))==NULL)
  {
  printf("fail to open the file1 !\n");
  exit(1);
  }
  if((fpDes=fopen(av[2],"a+"))==NULL)
  {
  printf("fail to open the file2 !\n");
  exit(1);
  }
  //进行循环读取
  while(!feof(fpSrc))//判断文件是否已结束;!feof(fpSrc)
  {
  fgets(Src_buf,MAXSIZES,fpSrc);
  Substitute(Src_buf,Des_buf,av[3],av[4]);
  fputs(Des_buf,fpDes);
  printf("%s",Des_buf);
  }
  fclose(fpSrc);
  fclose(fpDes);
  system("pause");
  return 0;
  }
百度网友76b05e43d
2012-03-11 · 超过16用户采纳过TA的回答
知道答主
回答量:61
采纳率:0%
帮助的人:62.1万
展开全部
你可以这样 写一个循环 按行读取(可以用fgets等) 里面的字符串 存放到一个临时数组中 然后 用strstr();查找里面是不是有data的字符串 返回非空就是找到了 然后再写进去 没找到继续读
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangluofan
2012-03-12 · TA获得超过888个赞
知道小有建树答主
回答量:1139
采纳率:0%
帮助的人:657万
展开全部
这个其实可以用一个正则表达式来完成,可以从文件中一个一个的读出来然后匹配替换就行了,具体方法网上找吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
weiyinwu
推荐于2017-11-25 · TA获得超过1540个赞
知道小有建树答主
回答量:1057
采纳率:50%
帮助的人:1178万
展开全部
楼上的方法是全部读出来到字符数组,然后替换修改后再全部写入到文件。
也可以使用以下这种方法:
读写方式打开文件,然后一个一个字符地读取,并进行关键字判定即d,a,t,a判定
当读取的字符为d时标记一下,下一个如果不是a则取消标记,依次判定完是否为data,如果是的话,移动到d处进行改写操作。。。
见如下replaceinfile();函数
#include <stdio.h>
#include <string.h>
void replaceinfile(const char *pfile,const char *repstr,const char *objstr);
void main()
{
replaceinfile("data.txt","_data","data");

}
void replaceinfile(const char *pfile,const char *repstr,const char *objstr)
{
int repcount=0;
FILE *fp,*fptmp=tmpfile();
int objstrlen=strlen(objstr);
if(fp=fopen(pfile,"r+"))
{
char c;
int flag=0;
while(c=fgetc(fp),c!=EOF)
{
for(int i=0;i<objstrlen;i++)
{
if(objstr[i]==c && i==flag)
{
flag++;
break;
}
}
if(i!=flag-1) flag=0;
fputc(c,fptmp);
if(flag==objstrlen)
{
fseek(fptmp,-objstrlen,SEEK_CUR);//
fputs(repstr,fptmp);
repcount++;
}
}
fseek(fptmp,0,SEEK_SET);
fseek(fp,0,SEEK_SET);
while(c=fgetc(fptmp),c!=EOF)
fputc(c,fp);
}
fclose(fp);
fclose(fptmp);
printf("文本\"%s\"替换成\"%s\",共替换了%d处!\n",objstr,repstr,repcount);
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
DXZ_M
2012-03-11
知道答主
回答量:6
采纳率:0%
帮助的人:6.4万
展开全部
找到 重写
更多追问追答
追问
你能再无聊点吗?
追答
不知文件格式
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式