
在C语言里在一个文件里搜索一个字符串并进行修改
比如说,我打开一个文件,修改其中的一个字符串叫做data为_data,如何进行修改?(文件名为data.txt)...
比如说,我打开一个文件,修改其中的一个字符串叫做data为_data,如何进行修改?(文件名为data.txt)
展开
5个回答
展开全部
#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;
}
#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;
}
展开全部
你可以这样 写一个循环 按行读取(可以用fgets等) 里面的字符串 存放到一个临时数组中 然后 用strstr();查找里面是不是有data的字符串 返回非空就是找到了 然后再写进去 没找到继续读
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个其实可以用一个正则表达式来完成,可以从文件中一个一个的读出来然后匹配替换就行了,具体方法网上找吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上的方法是全部读出来到字符数组,然后替换修改后再全部写入到文件。
也可以使用以下这种方法:
读写方式打开文件,然后一个一个字符地读取,并进行关键字判定即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,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);
}
本回答被提问者和网友采纳

你对这个回答的评价是?
展开全部
找到 重写
更多追问追答
追问
你能再无聊点吗?
追答
不知文件格式
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询