在文件夾中 的指定類型文件中 查找字元串(CodeBlocks+GCC編譯,控制台程式,僅能在Windows上運行)

来源:http://www.cnblogs.com/maxuewei2/archive/2016/04/15/5395621.html
-Advertisement-
Play Games

說明: 程式使用 io.h 中的 _findfirst 和 _findnext 函數遍歷文件夾,故而程式只能在 Windows 下使用。 程式遍歷當前文件夾,對其中的文件夾執行遞歸遍歷。同時檢查遍歷到的文件是否屬於指定類型,如果是,則將在該文件中查找指定字元串。 在文件中查找字元串時,開闢一個與指定 ...


說明:

  程式使用 io.h 中的 _findfirst 和 _findnext 函數遍歷文件夾,故而程式只能在 Windows 下使用。  

  程式遍歷當前文件夾,對其中的文件夾執行遞歸遍歷同時檢查遍歷到的文件是否屬於指定類型,如果是,則將在該文件中查找指定字元串。 

  在文件中查找字元串時,開闢一個與指定字元串 text 長度為len 同樣大小的字元串數組 temp 數組上有兩個指針:一個是字元串比較的開始位置 ,一個是新字元寫入的位置 。每從文件中讀入一個字元,就寫入 temp[d] ,之後 temp 從 到 與 text 從  len-1 比較,之後, 與 均後移一位,再繼續讀入字元,寫入,比較,後移。。。

 

 

代碼:

  1 #include<stdio.h>
  2 #include<vector>
  3 #include<string.h>
  4 #include<io.h>
  5 using namespace std;
  6 
  7 vector<char*> types;
  8 char text[256];
  9 
 10 void ls_path(char * path);
 11 bool is_in_types(char* filename);
 12 void findtext(char * filename,char* text);
 13 
 14 void solve(char* name,struct _finddata_t *f) {
 15     if(strcmp(f->name,".")==0)return ;
 16     if(strcmp(f->name,"..")==0)return ;
 17     char *fullpath=new char[256];
 18     strcpy(fullpath,name);
 19     int len=strlen(name);
 20     fullpath[len-1]='\0';
 21     strcat(fullpath,f->name);
 22     if(f->attrib&_A_SUBDIR) {
 23         strcat(fullpath,"/*");
 24         ls_path(fullpath);
 25     } else {
 26         if(is_in_types(f->name)) {
 27             findtext(fullpath,text);
 28         }
 29     }
 30     delete fullpath;
 31 }
 32 void ls_path(char * path) {
 33     struct _finddata_t f;
 34     int p;
 35     char *name=new char[260];
 36     strcpy(name,path);
 37     if((p=_findfirst(name, &f))!=-1) {
 38         solve(name,&f);
 39         while(_findnext(p, &f)==0) {
 40             solve(name,&f);
 41         }
 42     }
 43     delete name;
 44 }
 45 int strrncmp(char* a,const char* b,int n) {//比較兩字元串的最後n個字元
 46     int len=strlen(a);
 47     int j=0;
 48     for(int i=len-n; i<=len-1; i++) {
 49         if(a[i]!=b[j])return false;
 50         j++;
 51     }
 52     return j==n?true:false;
 53 }
 54 bool is_in_types(char* filename) {
 55     for(int i=0; i<types.size(); i++) {
 56         if(strrncmp(filename,types[i],strlen(types[i]))) {
 57             return true;
 58         }
 59     }
 60     return false;
 61 }
 62 bool cmp(const char* temp,const int len,const int s,const int d,const char* text) {
 63     int j=0;
 64     for(int i=s;; i++,i%=len) {
 65         if(temp[i]!=text[j])return false;
 66         if(i==d)break;
 67         j++;
 68     }
 69     return true;
 70 }
 71 void findtext(char * filename,char* text) {
 72     FILE *f=fopen(filename,"r");
 73     char c;
 74     int linenum=0;
 75     int len=strlen(text);
 76     char* temp=new char[len];
 77     int s=0,d=len-1;
 78     while(c=fgetc(f),c!=EOF) {
 79         temp[d]=c;
 80         if(cmp(temp,len,s,d,text))printf("文件名: %s \n行號: %d\n",filename,linenum+1);
 81         if(c=='\n'||c=='\r'||c=='\r\n') {
 82             linenum++;
 83         }
 84         d++;
 85         d%=len;
 86         s++;
 87         s%=len;
 88     }
 89     delete temp;
 90     fclose(f);
 91 }
 92 int main() {
 93     printf("**************************************\n");
 94     printf("本程式在其所在文件夾中查找指定類型文件\n中是否有指定字元串,並輸出所在行號。\n");
 95     printf("              CopyRight:  maxuewei2\n");
 96     printf("**************************************\n");
 97     while(true) {
 98         types.clear();
 99         printf("\n請輸入要查找的字元串:\n");
100         while(gets(text),strcmp(text,"")==0);
101         printf("請輸入文件類型,如‘txt’:(按兩下ENTER開始查找)\n");
102         char t[30];
103         while(gets(t),strcmp(t,"")!=0) {
104             char* tt=new char[30];
105             strcpy(tt,".");
106             strcat(tt,t);
107             types.push_back(tt);
108         }
109         delete t;
110         printf("查找結果:\n");
111         ls_path("*");
112     }
113     types.clear();
114     delete text;
115     getchar();
116     return 0;
117 }

 

 運行效果:

 

程式完成於2016.4.15

博客更新於2016.4.15

END


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要針對java反射進行學習,以java.lang.reflect包中的介面和類進行學習和理解。文章目錄如下: 1. java反射概念 2. java反射包介面詳解 3. java發射包中類詳解 4. java反射的應用例子 一:java反射概念 JAVA反射機制是在運行狀態中,對於任意一個類, ...
  • 1、問題使用jQuery的ajax請求 Servlet 時,返回沒有進入ajax的success回調函數,瀏覽器控制台顯示 [HTTP/1.1 405 Method not allowed]。 2、解決方法網上調查,大多都是如下解釋 Apache、IIS、Nginx等絕大多數web伺服器,都不允許靜 ...
  • 1、基本概念 a、路徑和路徑長度 若在一棵樹中存在著一個結點序列 k1,k2,……,kj, 使得 ki是ki+1 的雙親(1<=i<j),則稱此結點序列是從 k1 到 kj 的路徑。 從 k1 到 kj 所經過的分支數稱為這兩點之間的路徑長度,它等於路徑上的結點數減1. b、結點的權和帶權路徑長度 ...
  • 我也是PHP新手,通過w3cschool瞭解了一下php基本原理之後就開寫了。但仍是菜鳥。 先不管3DES加密的方法對不對,方法都是網上的,在運行的時候報了個錯,把小弟整死了。找來找去終於自己摸出了方法。 代碼可以不看,就看裡面的一句:$td = mcrypt_module_open( MCRYPT ...
  • python有很多擴展模塊需要安裝 這個時候萬能的pip就可以提供幫助 首頁進入官網下載壓縮包: https://pypi.python.org/pypi/pip#downloads 解壓文件 cmd進入解壓文件路徑下輸入 python setup.py install 下來要使用pip一定要先進入 ...
  • 目錄 1. Apache Lucene(全文檢索引擎)—創建索引:http://www.cnblogs.com/hanyinglong/p/5387816.html 2. Apache Lucene(全文檢索引擎)—搜索:http://www.cnblogs.com/hanyinglong/p/53 ...
  • 1、簡介 這個和數組的排序又不一樣了。 其實Java針對數組和List的排序都有實現,對數組而言,你可以直接使用Arrays.sort,對於List和Vector而言,你可以使用Collections.sort方法。 Java API針對集合類型的排序提供了2個方法: 如果集合裡面的元素都是相同類型 ...
  • 項目中遇到將位元組數據文件解析成可展示的十進位,經過調查和測試得出下麵的轉換方法 1、將byte值轉換為二進位字元串: 2、將二進位字元串轉換為十進位: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...