当前位置: 技术问答>linux和unix
新手求助一道编程题,关于文件操作的
来源: 互联网 发布时间:2016-12-04
本文导语: 打开一文本文件,给出字符串(char *parrern)在文件的哪些行出现,要求在屏幕上显示出匹配的行号和那一行的文件内容。 求助。。。 | #include #include #include int main(int argc, char *argv[]) ...
打开一文本文件,给出字符串(char *parrern)在文件的哪些行出现,要求在屏幕上显示出匹配的行号和那一行的文件内容。
求助。。。
求助。。。
|
#include
#include
#include
int main(int argc, char *argv[])
{
FILE *stream;
char buf[255];
int c;
int rowcount=1;
int bufcount=0;
if(argc!=3){
printf("Please enter a filename and stringn");
exit(EXIT_FAILURE);
}
stream=fopen(argv[1],"r");
if(stream==NULL){
printf("Can't open the file: %sn",argv[1]);
exit(EXIT_FAILURE);
}
fseek(stream,0,SEEK_SET);
while((c=fgetc(stream))!=EOF){
if(c=='n'){
if(strstr(buf,argv[2])!=0){
buf[bufcount]='';
printf("%d ",rowcount);
printf("%sn",buf);
}
rowcount++;
bufcount=0;
}
else{
buf[bufcount++]=c;
}
}
printf("The search is endn");
fclose(stream);
exit(EXIT_SUCCESS);
}
该程序是否满足你的要求?
有个小问题:该程序仅能判断某行是否包含要查询的字符串,不能做到单词的准确匹配.
例如:如果在以上文件中查询字符串“int”,则含有“printf”的行也会打印出来,因为printf中含有int.
如果要做到单词的准确匹配,可定义一个字符串strbuf[],以空格键为间隔,保存单词,再调用strcmp()判断是否一致? 这个留给你自己来实现。
#include
#include
int main(int argc, char *argv[])
{
FILE *stream;
char buf[255];
int c;
int rowcount=1;
int bufcount=0;
if(argc!=3){
printf("Please enter a filename and stringn");
exit(EXIT_FAILURE);
}
stream=fopen(argv[1],"r");
if(stream==NULL){
printf("Can't open the file: %sn",argv[1]);
exit(EXIT_FAILURE);
}
fseek(stream,0,SEEK_SET);
while((c=fgetc(stream))!=EOF){
if(c=='n'){
if(strstr(buf,argv[2])!=0){
buf[bufcount]='';
printf("%d ",rowcount);
printf("%sn",buf);
}
rowcount++;
bufcount=0;
}
else{
buf[bufcount++]=c;
}
}
printf("The search is endn");
fclose(stream);
exit(EXIT_SUCCESS);
}
该程序是否满足你的要求?
有个小问题:该程序仅能判断某行是否包含要查询的字符串,不能做到单词的准确匹配.
例如:如果在以上文件中查询字符串“int”,则含有“printf”的行也会打印出来,因为printf中含有int.
如果要做到单词的准确匹配,可定义一个字符串strbuf[],以空格键为间隔,保存单词,再调用strcmp()判断是否一致? 这个留给你自己来实现。
|
这个属于字符串匹配问题。计算行号可以设置一个变量count,遇到换行符就自动加一。还要设一个字符数组,如A[80],用于存放当前扫描的行的字符串,如果该行出现了(char *parrern),则把该数组值及count值输出;若未出现,则继续扫描下一行,并用下一行的字符覆盖数组A[80]中的值。
|
逐行读取,逐行判断
|
设置一个记数器,用于保存行号,然后打开文件用行读取的方式去读,每读一行记数器加一,然后判断下有没有char *parrern里面的内容,有就打印该行和记数器的值,没有继续读下一行.直到读完整个文件.记得每次读之前把buf清空
|
fgets--一次读一行,读到文件结束返回NULL;
strstr--从读出内容中查找指定字符串(没有则返回NULL)
搞个循环,OK了。
strstr--从读出内容中查找指定字符串(没有则返回NULL)
搞个循环,OK了。
|
这里关键是用 strstr这个函数,这个函数实现不难,楼主可以自己用C实现一下!!