说明:

  程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用。  

  程序遍历当前文件夹,对其中的文件夹执行递归遍历。同时检查遍历到的文件是否属于指定类型,如果是,则将在该文件中查找指定字符串。 

  在文件中查找字符串时,开辟一个与指定字符串 text (长度为len )同样大小的字符串数组 temp 。数组上有两个指针:一个是字符串比较的开始位置 ,一个是新字符写入的位置 。每从文件中读入一个字符,就写入 temp[d] ,之后 temp 从 到 与 text 从  len-1 比较,之后, 与 均后移一位,再继续读入字符,写入,比较,后移。。。

代码:

 #include<stdio.h>
#include<vector>
#include<string.h>
#include<io.h>
using namespace std; vector<char*> types;
char text[]; void ls_path(char * path);
bool is_in_types(char* filename);
void findtext(char * filename,char* text); void solve(char* name,struct _finddata_t *f) {
if(strcmp(f->name,".")==)return ;
if(strcmp(f->name,"..")==)return ;
char *fullpath=new char[];
strcpy(fullpath,name);
int len=strlen(name);
fullpath[len-]='\0';
strcat(fullpath,f->name);
if(f->attrib&_A_SUBDIR) {
strcat(fullpath,"/*");
ls_path(fullpath);
} else {
if(is_in_types(f->name)) {
findtext(fullpath,text);
}
}
delete fullpath;
}
void ls_path(char * path) {
struct _finddata_t f;
int p;
char *name=new char[];
strcpy(name,path);
if((p=_findfirst(name, &f))!=-) {
solve(name,&f);
while(_findnext(p, &f)==) {
solve(name,&f);
}
}
delete name;
}
int strrncmp(char* a,const char* b,int n) {//比较两字符串的最后n个字符
int len=strlen(a);
int j=;
for(int i=len-n; i<=len-; i++) {
if(a[i]!=b[j])return false;
j++;
}
return j==n?true:false;
}
bool is_in_types(char* filename) {
for(int i=; i<types.size(); i++) {
if(strrncmp(filename,types[i],strlen(types[i]))) {
return true;
}
}
return false;
}
bool cmp(const char* temp,const int len,const int s,const int d,const char* text) {
int j=;
for(int i=s;; i++,i%=len) {
if(temp[i]!=text[j])return false;
if(i==d)break;
j++;
}
return true;
}
void findtext(char * filename,char* text) {
FILE *f=fopen(filename,"r");
char c;
int linenum=;
int len=strlen(text);
char* temp=new char[len];
int s=,d=len-;
while(c=fgetc(f),c!=EOF) {
temp[d]=c;
if(cmp(temp,len,s,d,text))printf("文件名: %s \n行号: %d\n",filename,linenum+);
if(c=='\n'||c=='\r'||c=='\r\n') {
linenum++;
}
d++;
d%=len;
s++;
s%=len;
}
delete temp;
fclose(f);
}
int main() {
printf("**************************************\n");
printf("本程序在其所在文件夹中查找指定类型文件\n中是否有指定字符串,并输出所在行号。\n");
printf(" CopyRight: maxuewei2\n");
printf("**************************************\n");
while(true) {
types.clear();
printf("\n请输入要查找的字符串:\n");
while(gets(text),strcmp(text,"")==);
printf("请输入文件类型,如‘txt’:(按两下ENTER开始查找)\n");
char t[];
while(gets(t),strcmp(t,"")!=) {
char* tt=new char[];
strcpy(tt,".");
strcat(tt,t);
types.push_back(tt);
}
delete t;
printf("查找结果:\n");
ls_path("*");
}
types.clear();
delete text;
getchar();
return ;
}

运行效果:

程序完成于2016.4.15

博客更新于2016.4.15

END

在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)的更多相关文章

  1. linux下删除3分钟之前指定文件夹下的指定类型文件

    如果想要修改crontab,一般做以下的几步就可以了 将crontab 推到一个自定义的文件上 crontab -l>;tmp 编辑这个文件,做需要的修改 vi tmp 推回crontab cr ...

  2. 怎样cp文件夹时忽略指定的文件夹和文件

    在备份ltedecoder程序时,须要把此文件夹拷由到bak文件夹下.但decoder文件夹下有个大文件,不须要备份,还有日志问题,也不须要备份,怎样实现呢?? 方法: cd /source-dir ...

  3. C#读取文件夹下所有指定类型,并返回相应类型数据

    C#读取文件夹下所有文件 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  4. C#遍历文件夹下面所有指定格式文件

    C#遍历指定文件夹中的所有文件 DirectoryInfo TheFolder=new DirectoryInfo(folderFullName);//遍历文件夹foreach(DirectoryIn ...

  5. matlab操作之--读取指定文件夹下的“指定格式”文件

    %% 正负样本所在folder fext='*.png';%要读取的文件格式 positiveFolder='F:\课题\Crater detection\machingLearning\Positi ...

  6. Windows删除文件夹下的指定格式文件(递归删除)

    问题描述: 今天遇到一个需求,需要对文件夹进行文件筛选.目录结构较为复杂(目录较多,层次较深),数据量较大(总共60GB左右). 鉴于上述情况,直接排除了人工处理方式(否则小伙伴们会打死我的). 解决 ...

  7. iOS 获得指定文件夹下的指定格式文件

    这个容易忘记,然后只能用些自己写的长代码代替了....这里做个备忘 主要用到NSFileManager的 contentsOfDirectoryAtPath:error: 和 NSArray的 pat ...

  8. C#项目打开/保存文件夹/指定类型文件,获取路径

    C#项目打开/保存文件夹/指定类型文件,获取路径 转:http://q1q2q363.xiaoxiang.blog.163.com/blog/static/1106963682011722424325 ...

  9. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

随机推荐

  1. win10与ubuntu下演示运行.net core rc2 1.0.0.3002702程序

    随着.net core rc2(1.0.0.002702)发布的同时,我们也来在本地 win10与ubuntu玩一下吧. 先简单说下.net core ,在.net core rc1中用的是dnx 工 ...

  2. luogg_java学习_12_线程

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 线程 程序.进程.线程的概念 程序:我们用程序设计语言 ...

  3. Java异常处理机制 try-catch-finally 剖析

    Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...

  4. sql where传入类型不同,造成查询结果差异问题

    话说故事是这样的.请听小生慢慢道来: 原有数据样式如下: 正常结果: 问题展现: 此问题主要原因如下: 以下皆可在官网中找到: 为数据类型从高到低依次:(ps:小生用翻译工具翻译,就不在此献丑了) 根 ...

  5. hive 删除分区数据

    alter table 表 drop partition(分区); 例: 表是:  user_all_info 分区是 day_id,month_id 我要删除10月10号的数据 那么: alter ...

  6. linux top命令查看内存及多核CPU的使用讲述

    查看多核CPU命令 mpstat -P ALL  和  sar -P ALL 说明:sar -P ALL > aaa.txt   重定向输出内容到文件 aaa.txt top命令 经常用来监控l ...

  7. [翻译]用 Puppet 搭建易管理的服务器基础架构(2)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第二部分. 原文地址:http://blog.jobbole.com/87680/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...

  8. Oracle常用SQL查询

    一.ORACLE的启动和关闭 1.在单机环境下要想启动或关闭oracle系统必须首先切换到oracle用户,如下: su - oracle a.启动Oracle系统 oracle>svrmgrl ...

  9. SharePoint 2013 CSOM creat post in NewsFeed Access Denied

    现象 在用CSOM创建新闻源时候,报错:无访问权限 解决办法 value="true" 改为 value="false" <appSettings> ...

  10. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...