在文件夾中 的指定類型文件中 查找字元串(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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...