#include
#include
#include
#define FILE_NAME_MAX 50
#define SEPERATE_STRING_MAX 100
int StrCount(FILE *file,char *str);
int main()
{
char *filename,*spestr;
FILE *fp;
filename=(char *)malloc(FILE_NAME_MAX);
spestr=(char *)malloc(SEPERATE_STRING_MAX);
printf("Input the filename:");
while(1)
{
scanf("%s",filename);
fp=fopen(filename,"r");
if(fp!=NULL)
{
break;
}
printf("Can't open the file.Try Again!");
}
printf("Input the special string:");
scanf("%s",spestr);
printf("%d times of %s in %s.",StrCount(fp,spestr),spestr,filename);
fclose(fp);
free(filename);
free(filename);
return 0;
}
int StrCount(FILE *file,char *str)
{
int count=0;
char ch;
int p=0;;
while((ch=fgetc(file))!=EOF)
{
// 当前读入的字符匹配 str 相应位置的字符
if(ch == str[p])
{
// 匹配下一个字符
p++;
// 如果已经匹配成功
if(str[p] == '\0')
{
count++;
// 从头开始重新匹配
p = 0;
}
}
// // 当前读入的字符不匹配 str 相应位置的字符
else
{
// 匹配失败,文件指针回溯
fseek(file,(p>0?-(p-1):0),SEEK_CUR);
// 从头开始重新匹配
p = 0 ;
}
}
return count;
}
#include
#include
#include
#include
using namespace std;
int Count=0;
/*
*函数名:findNum
*作者:anglecloudy
*描述:如果存在则返回字符串所在的位置,否则返回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
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;
}
我只是简单的改了一下你的字符串查找这个函数,其它的没写。主要是你的思想不对,对文件的操作一般先定义一个数组,把文件保存起来,然后再操作,多去上面问问,高手多,下班了。88
int StrCount(FILE *file,char *str)
{
int i,j,k,length,length_file=0,count=0;
char ch,q,*temp;
char s[20];
q=*str;
length=strlen(str);
while((ch=fgetc(file))!=EOF)
{
s[length_file]=ch;
length_file++;
}
s[length_file]='\0';
printf("%s,%s\n",s,str);
for(i=0;s[i];i++)
for(j=i,k=0;s[j]==str[k];k++,j++)
{
if(str[k+1]=='\0')
{
count++;
break;
}
}
return count;
}
主程序不变,修改StrCount(FILE *file,char *str)函数,以上是我改好的,我试了下OK!,
我的思路是把文件里的内容读出到数组中,然后直接找出这个数组中你需要字符串的个数。
int Strcount(FILE *fp, char *str)
{
char buf[128] = {0};
int len = strlen(str);
int count = 0;
char ch;
while ((ch = fgetc(fp)) != EOF)
{
if (str[0] != ch)
continue;
fgets(buf, len, fp);
if (strncmp(buf, str + 1, len) == 0)
count++;
else
fseek(fp, -len, SEEK_CUR);
}
return count;
}
运行结果:
[root@beauty ~]# cat a.txt
hello world hello people
hello good
say hello hellohello
[root@beauty ~]# ./a.out
6
hello world hello people
hello good
say hello hellohello 是文件内容, 6是统计结果