用C语言实现文件的查找与替换
追问:(请输入您要用于操作的文件名及其完整路径) 这个文件是要我自己输入么??
我还是不太懂啊,能不能加点注释,我有的看的不太懂.
麻烦你了哈!~~
追问:(请输入您要用于操作的文件名及其完整路径) 这个文件是要我自己输入么??
我还是不太懂啊,能不能加点注释,我有的看的不太懂.
麻烦你了哈!~~
答案:#include"stdio.h"
#include"stdlib.h"
main()
{
FILE *fp;
char str[80],*p,*head;
int n=0;
long filelen;
loop1:printf("请输入您要用于操作的文件名及其完整路径:\n");
gets(str);
fp=fopen(str,"rb+");
if(fp==NULL)
{
printf("找不到指定文件,要指定新文件吗?(y=是的,要指定新文件\telse=不用了,退出程序)\t");
gets(str);
if((char)tolower((int)str[0])=='y')goto loop1;
else exit(0);
}
printf("请输入您要查找并替换的字符(如果输入的字符数量大于1本程序会自动舍去多余的部分)\n");
gets(str);
printf("请输入您要将找到的字符或字符串替换为的字符(自动舍去多余部分)\n");
gets(&str[1]);
fseek(fp,0L,2);
filelen=ftell(fp);
fseek(fp,0L,0);
head=(char *)malloc(filelen);
fread(head,filelen,1,fp);
for(p=head;p<head+filelen/1L;p++)if(*p==str[0]){*p=str[1];n++;}
fseek(fp,0L,0);
fwrite(head,filelen,1,fp);
fclose(fp);
printf("替换已经完成,共替换%d处\n",n);
}你可以自己试一下!
以下只是一个例子:
思路是一行一行的读然后查找再替换,简化读写。设一文件w00.dat,内容为:
I like you, do you like me?
like father like son.
When I was a child I fell in love with a very pretty young lady.
In my heart,she was like a fairy .
I love her till this time of today!
I am young,handsome and full of energy. like and alike are like.
That is all, thank you! likely is alike as likely as not.
编写一个c程序,将上述文件中的所有单词like改为LOVE,显示结果并写入文件w01.txt中。
本题的一个完整的c程序如下,程序在win-tc和Dev-c++下调试通过。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define N 100 /*设文章不超过100行,可更改*/
char s[N][81];
int main()
{
int i=0,j,max;
char *p;
FILE *fp1,*fp2;
fp1=fopen("w00.txt","r");
fp2=fopen("w01.txt","w");
while (i<N&&fgets(s[i],81,fp1)!=NULL)
{
p=strchr(s[i],'\n');
if(p)
*p='\0';
i++;
}
max=i; /*max为文章实际的最大行数*/
for(i=0;i<max;i++)
for(j=0;j<strlen(s[i])-5;j++)
{ if((s[i][j]==' '&&s[i][j+1]=='l'&&s[i][j+2]=='i'&&s[i][j+3]=='k'&&s[i][j+4]=='e'&&(!isalpha(s[i][j+5])))
)
{
s[i][j+1]='L';
s[i][j+2]='O';
s[i][j+3]='V';
s[i][j+4]='E';
}
else if (s[i][0]=='l'&&s[i][1]=='i'&&s[i][2]=='k'&&s[i][3]=='e'&&(!isalpha(s[i][4])))/*考虑当like位于一行开头时的情况*/
{
s[i][0]='L';
s[i][1]='O';
s[i][2]='V';
s[i][3]='E';
}
}
for(i=0;i<max;i++)
{ fprintf(fp2,"%s\n",s[i]);
printf("%s\n",s[i]);
}
fclose(fp1);
fclose(fp2);
getch();
return 0;
}#include<iostream>
#include<conio.h>
#include<string>
#include<stdlib.h>
using namespace std;
int Count=0;
/*
*描述:如果存在则返回字符串所在的位置,否则返回0,暂不支持文本中存在多个相同的串
* 先用test.txt文本测试,所有的文本操作都是一样的,不管你怎么命名
*/
int findNum(char *str)
{
FILE *p;
if((p=fopen("test.txt","rb"))==NULL)
{
printf("\n打开文件失败\n");
return 0;
}
char buffer[0x1000]; //保存文件
memset(buffer,0,0x1000); //初始化缓存
size_t fileLen=fread(buffer,sizeof(char),0x1000,p); //得到文件内容,
int readLen=strlen(str);
int IsFind=0;
for(int i=0;i<fileLen;i++)
{
if(strncmp(buffer+i,str,readLen)==0)
{
IsFind=i;
}
}
fclose(p);
return IsFind;
}
int main(void)
{
char *str1="1234567";
int t1=0,t2=0;
if((t1=findNum(str1))==0)
{
printf("没有找到字符串%s\n请按任意键退出\n",str1);
return -1;
}
else
{
printf("字符串%s的位置在%d\n",str1,t1);
}
return 0;
}
上一个:如何学习好C语言。。请指教?
下一个:谁给我c语言的入门学习视频,