在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 文件资源管理器打开此路径,求头文件,求代码
在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追问
编译过不去。。。。全是错误。。。。
![](https://image.cha138.com/20230318/f3eb67bf55824788be331ce2afc7272c.jpg)
#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语言里在一个文件里搜索一个字符串并进行修改的主要内容,如果未能解决你的问题,请参考以下文章