- 存储qq的文件地址以及按照密码相似度排序的文件地址
1 //存储qq的文件的地址 2 char path[512] = "QQ.txt"; 3 //按照密码相似度排序的文件地址 4 char pathsortbypass[512] = "QQpasswordsort.txt";
- 标识qq一共有多少行
1 //文件一共有多少行 2 #define N 84331446
- 创建结构体存储密码,并把文件载入内存
1 //密码信息 2 struct info 3 { 4 char str[17]; 5 }; 6 7 //指向所有结构体的指针 8 struct info *pall = NULL;
1 //初始化 2 void init() 3 { 4 //记录时间 5 time_t start, end; 6 time(&start); 7 8 pall = calloc(N, sizeof(struct info));//分配内存 9 if (pall==NULL) 10 { 11 puts("calloc fail"); 12 return; 13 } 14 //打开文件 15 FILE *pf = fopen(path, "r"); 16 17 //依次读取 18 for (int i = 0; i <N; i++) 19 { 20 char str[50] = { 0 }; 21 fgets(str, 50, pf); 22 char *pfind = strstr(str, "----"); 23 //每行格式123----qweqe 24 if (pfind !=NULL) 25 { 26 int length = strlen(pfind + 4); 27 //刷掉非法密码 28 if (length<17) 29 { 30 //拷贝字符串 31 strcpy(pall[i].str, pfind + 4); 32 } 33 } 34 } 35 //关闭文件 36 fclose(pf); 37 time(&end); 38 printf("文件读取话费%f秒\n", difftime(end, start)); 39 }
- 按照相似度快速排序
1 //快速排序比较函数,比较两个结构体 2 int com(void *p1, void *p2) 3 { 4 struct info *pinfo1 = p1; 5 struct info *pinfo2= p2; 6 return strcmp(pinfo1->str, pinfo2->str);//排序的函数 7 } 8 9 //排序 10 void sort() 11 { 12 //记录时间 13 time_t start, end; 14 time(&start); 15 16 //快速排序 17 qsort(pall, N, sizeof(struct info), com); 18 19 time(&end); 20 printf("排序话费%f秒\n", difftime(end, start)); 21 }
- 写入文件
1 //写入文件 2 void writetofile() 3 { 4 //存储时间 5 time_t start, end; 6 //开始时间 7 time(&start); 8 //以写的方式打开文件 9 FILE *pf = fopen(pathsortbypass, "w"); 10 //判断每一个 11 for (int i = 0; i < N; i++) 12 { 13 //格式 5----pass 14 char allstr[100] = { 0 }; 15 //存储密码 16 char istr[100] = { 0 }; 17 strcpy(istr, pall[i].str);//拷贝备份 18 19 int j = 1;//出现一次 20 //循环直到最后一个不相等 21 while (strcmp(pall[i].str,pall[i+1].str)==0) 22 { 23 i++;//循环前进 24 j++;//计数 25 } 26 //合成字符串写入 27 sprintf(allstr, "%d----%s", j, istr); 28 //写入到文件 29 fputs(allstr, pf); 30 } 31 32 //关闭文件 33 fclose(pf); 34 35 //结束 36 time(&end); 37 38 printf("排序花费%f秒\n", difftime(end, start)); 39 }
- 获取文件有多少行
1 //获取文件有多少行 2 int getN(char *path) 3 { 4 int i = 0; 5 FILE *pf = fopen(path, "r"); 6 if (pf==NULL) 7 { 8 return -1; 9 } 10 else 11 { 12 while (!feof(pf)) 13 { 14 char str[50] = { 0 }; 15 fgets(str, 50, pf); 16 i++; 17 } 18 19 fclose(pf); 20 return i; 21 } 22 }
- 主函数
1 //主函数 2 void main() 3 { 4 //初始化载入到内存 5 init(); 6 //密码相似度排序 7 sort(); 8 //写入文件 9 writetofile(); 10 system("pause"); 11 }
完整代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<time.h> 6 7 //存储qq的文件的地址 8 char path[512] = "QQ.txt"; 9 //按照密码相似度排序的文件地址 10 char pathsortbypass[512] = "QQpasswordsort.txt"; 11 //文件一共有多少行 12 #define N 84331446 13 14 //密码信息 15 struct info 16 { 17 char str[17]; 18 }; 19 20 //指向所有结构体的指针 21 struct info *pall = NULL; 22 23 //写入文件 24 void writetofile() 25 { 26 //存储时间 27 time_t start, end; 28 //开始时间 29 time(&start); 30 //以写的方式打开文件 31 FILE *pf = fopen(pathsortbypass, "w"); 32 //判断每一个 33 for (int i = 0; i < N; i++) 34 { 35 //格式 5----pass 36 char allstr[100] = { 0 }; 37 //存储密码 38 char istr[100] = { 0 }; 39 strcpy(istr, pall[i].str);//拷贝备份 40 41 int j = 1;//出现一次 42 //循环直到最后一个不相等 43 while (strcmp(pall[i].str,pall[i+1].str)==0) 44 { 45 i++;//循环前进 46 j++;//计数 47 } 48 //合成字符串写入 49 sprintf(allstr, "%d----%s", j, istr); 50 //写入到文件 51 fputs(allstr, pf); 52 } 53 54 //关闭文件 55 fclose(pf); 56 57 //结束 58 time(&end); 59 60 printf("排序花费%f秒\n", difftime(end, start)); 61 } 62 63 64 //快速排序比较函数,比较两个结构体 65 int com(void *p1, void *p2) 66 { 67 struct info *pinfo1 = p1; 68 struct info *pinfo2= p2; 69 return strcmp(pinfo1->str, pinfo2->str);//排序的函数 70 } 71 72 //排序 73 void sort() 74 { 75 //记录时间 76 time_t start, end; 77 time(&start); 78 79 //快速排序 80 qsort(pall, N, sizeof(struct info), com); 81 82 time(&end); 83 printf("排序话费%f秒\n", difftime(end, start)); 84 } 85 86 //初始化 87 void init() 88 { 89 //记录时间 90 time_t start, end; 91 time(&start); 92 93 pall = calloc(N, sizeof(struct info));//分配内存 94 if (pall==NULL) 95 { 96 puts("calloc fail"); 97 return; 98 } 99 //打开文件 100 FILE *pf = fopen(path, "r"); 101 102 //依次读取 103 for (int i = 0; i <N; i++) 104 { 105 char str[50] = { 0 }; 106 fgets(str, 50, pf); 107 char *pfind = strstr(str, "----"); 108 //每行格式123----qweqe 109 if (pfind !=NULL) 110 { 111 int length = strlen(pfind + 4); 112 //刷掉非法密码 113 if (length<17) 114 { 115 //拷贝字符串 116 strcpy(pall[i].str, pfind + 4); 117 } 118 } 119 } 120 //关闭文件 121 fclose(pf); 122 time(&end); 123 printf("文件读取话费%f秒\n", difftime(end, start)); 124 } 125 126 127 //获取文件有多少行 128 int getN(char *path) 129 { 130 int i = 0; 131 FILE *pf = fopen(path, "r"); 132 if (pf==NULL) 133 { 134 return -1; 135 } 136 else 137 { 138 while (!feof(pf)) 139 { 140 char str[50] = { 0 }; 141 fgets(str, 50, pf); 142 i++; 143 } 144 145 fclose(pf); 146 return i; 147 } 148 } 149 150 151 //主函数 152 void main() 153 { 154 //初始化载入到内存 155 init(); 156 //密码相似度排序 157 sort(); 158 //写入文件 159 writetofile(); 160 system("pause"); 161 }