一个和文件指针相关的奇怪问题
目的是在当前文件夹下的某个文件中搜索某个字符串出现的次数.代码如下:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
void main(void)
{
FILE *fp;
int count(0);
long str_len;
char FileName[20],str[20],temp[20],ch;
for(;;){
system("cls");
cout<<"输入目标文件名(二十字节以内):"<<endl;
scanf("%20s",FileName);
fflush(stdin);
if((fp = (fopen(FileName,"r"))) != NULL)break;
cout<<"无此文件,请重新输入,按任意键继续……"<<endl;
str_len = strlen(str);
getchar();
}
cout<<"目标字符串(二十字节以内):"<<endl;
scanf("%20s",str);
fflush(stdin);
str_len = long(strlen(str)); //以上完成了文件名和字符串的输入
下面就很奇怪了
while(1){
fseek(fp,str_len - 1,1); //跳到即将取的字符串末尾,检测其是否为文件末尾
ch=fgetc(fp); //333333333333333333333333333333333333333333
if(feof(fp))break; //如是则跳出
fseek(fp,-(str_len),1);//不是则文件指针返回以前位置 //555555555555555555555555
fread(temp,1,strlen(str),fp); //取与目标字符串相等长度的字符串
temp[strlen(str)]='\0';//取出的字符串末尾加‘/0’与目标字符串相匹配
if(strcmp(str,temp) == 0)count++; //比较,相等则计数器加1
fseek(fp,-(str_len - 1);//文件中从第二字符开始的字符串
}
cout<<"此字符串在目标文件夹中共出现"<<count<<"次。"<<endl;
}
如果这样执行的话是可以的,而且结果也是正确的问题是上面第三行(注释为!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)的是我调试时候为了看当前fp指向字符时自己加的,当然也相应的在第五行多返回了一个字节.
现在我想把ch=fgetc(fp);这行去掉,并且把注释为555555555555555的改成fseek(fp,-(str_len-1),1);应该和开始是一样的啊,但执行时当输入目标字符串后就程序就停在那里了,小弟百思不得其解,望各方神仙点化!!!
再则,我又想了一段来代替刚才的那段:
while(!feof(fp)){
fread(temp,1,str_len,fp); //取与目标字符串相等长度的字符串
temp[str_len]='\0';//取出的字符串末尾加‘/0’与目标字符串相匹配
if(strcmp(str,temp) == 0)count++; //比较,相等则计数器加1
fseek(fp,-(str_len - 1),1);//开始检查文件中从第二字符开始的字符串
}
cout<<"此字符串在目标文件夹中共出现"<<count<<"次。"<<endl;
}问题还是同样,执行时当输入目标字符串后就程序就停在那里了,不知何故?