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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C语言里在一个文件里搜索一个字符串并进行修改相关的知识,希望对你有一定的参考价值。

比如说,我打开一个文件,修改其中的一个字符串叫做data为_data,如何进行修改?(文件名为data.txt)

  #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;
  
参考技术A 你可以这样 写一个循环 按行读取(可以用fgets等) 里面的字符串 存放到一个临时数组中 然后 用strstr();查找里面是不是有data的字符串 返回非空就是找到了 然后再写进去 没找到继续读 参考技术B 这个其实可以用一个正则表达式来完成,可以从文件中一个一个的读出来然后匹配替换就行了,具体方法网上找吧。 参考技术C 楼上的方法是全部读出来到字符数组,然后替换修改后再全部写入到文件。
也可以使用以下这种方法:
读写方式打开文件,然后一个一个字符地读取,并进行关键字判定即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);
本回答被提问者和网友采纳
参考技术D 找到 重写追问

你能再无聊点吗?

追答

不知文件格式

追问

ASCII可直接读的

追答

我是说你写文件的格式 怎么布局的

c语言如何获得文件当前路径?

获得不包含本程序名的双斜杠路径,并用windows 文件资源管理器打开此路径,求头文件,求代码

C语言里
在main函数的第二个参数里面,
保存着当前程序运行的目录
也就是argv[0]
main( int argc, char *argv[])

printf("%s ", argv[0] );

就是文件当前所在位置
不过需要注意的一点是
这个路径里面保存了当前文件的文件名
如果你只是需要路径的话还需要自己操作一下

main(int a,char *c[])

char s[100];
int i;
//把路径保存到字符串s里
strcpy(s,c[0]);
for(i=strlen(s); i>0 ; i--)
if( s[i] == '\\')

s[i]='\0';
break;

//找到最后一个 \ 并删除之后的内容
//最后输出的s,就是当前文件的路径了
puts(s);
参考技术A

http://hi.baidu.com/andywangcn/item/7633efda5517baf9ca0c39c6

获得双斜杠路径不包含文件名

TCHAR _szPath[MAX_PATH + 1]=0;
GetModuleFileName(NULL, _szPath, MAX_PATH);
(_tcsrchr(_szPath, _T('\\\\')))[1] = 0;//删除文件名,只获得路径 字串
CString strPath;
for (int n=0;_szPath[n];n++)

if (_szPath[n]!=_T('\\\\'))
   
strPath +=_szPath[n] ;

else
   
strPath += _T("\\\\\\\\");


MessageBox(strPath);//输出==e:\\\\program\\\\Debug\\\\
//头文件用到 windows.h

追问

编译过不去。。。。全是错误。。。。

追答#include <iostream>
#include <Windows.h>
#include <tchar.h>


#ifdef MAX_PATH
#undef MAX_PATH
#endif

#define MAX_PATH 256


using namespace std;

int main()

TCHAR _szPath[MAX_PATH + 1]=0;
//获取当前文件的位置
GetModuleFileName(NULL, _szPath, MAX_PATH);
  cout<<_szPath<<endl;
int i,pos;
//寻找最后一个'\\\\'
for (i=0;i<MAX_PATH;i++)

if (_szPath[i]=='\\\\')

pos = i;


_szPath[pos]='\\0';
cout<<_szPath<<endl;
return 0;

追问

用windows 文件资源管理器打开此路径呢?你这个运行后是单斜杠路径,没法用system打开windows 文件资源管理器的。。。这个方法我用c试过了,在main括号里填点东西就能输出路径,关键是如何用windows 文件资源管理器打开此路径

以上是关于在C语言里在一个文件里搜索一个字符串并进行修改的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何在一个字符串里搜索出其中的字母和数字啊?谢谢

C语言的程序里在main主函数之前需要啥?

c语言如何获得文件当前路径?

C语言怎样将数字从文件里逐个读取出来

如何用C语言统计一个数据文件中的数据个数

c语言中从文件中按行读取字符串,并进行相应操作。