程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 在文件夾中 的指定類型文件中 查找字符串(CodeBlocks+GCC編譯,控制台程序,僅能在Windows上運行),codeblocksgcc

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

編輯:C++入門知識

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


說明:

  程序使用 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved