68.qq號索引結構體寫入內存,並實現快速排序
阿新 • • 發佈:2018-02-13
ets style pau ont 步驟 之前 比較 多個 兩個
1 //兩個步驟,第一步讀取文件,並且初始化索引結構體,把初始化的索引結構體寫入到文件,第二步,讀取這個文件到索引結構體 2 //並對這個結構體進行快速排序,得到順序的索引,再寫入文件 3 #define _CRT_SECURE_NO_WARNINGS 4 #include<stdio.h> 5 #include<stdlib.h> 6 7 char path[256] = "QQ.txt"; 8 char indexpath[256] = "QQindex8848.txt"; 9 char sortindexpath[256] = "QQsortindex8848.txt"; 10 11 #define allN 84331072 12 13 struct INDEX 14 { 15 //QQ號 16 long long QQ; 17 //索引 18 int index; 19 }; 20 //簡化索引 21 typedef struct INDEX Index; 22 23 //從字符串獲取qq號,存放在tmp中,並在tmp中提取QQ號 24 void getQQ(char *str, char *tmp) 25 { 26 strcpy(tmp, str); 27 char *p = tmp;28 while (*p) 29 { 30 if (*p == ‘-‘) 31 { 32 *p = ‘\0‘; 33 break; 34 } 35 p++; 36 } 37 } 38 39 //每一行讀取到索引 40 void main1() 41 { 42 FILE *pfr = fopen(path, "r"); 43 FILE *pfw = fopen(indexpath, "wb"); 44 45 while(!feof(pfr)) 46 { 47 //獲取當前文件指針距離開頭的位置,在讀取之前讀取,讀取的是每一行開頭的位置 48 int index = ftell(pfr); 49 50 char str[50] = { 0 }; 51 //讀取 52 fgets(str, 50, pfr); 53 char tmp[50] = { 0 }; 54 //獲取QQ到tmp 55 getQQ(str, tmp); 56 //把QQ轉換成long long類型 57 long long lltmp = atoll(tmp); 58 if (lltmp==0) 59 { 60 continue; 61 } 62 Index in1 = { 0 }; 63 in1.QQ = lltmp; 64 in1.index = index; 65 //把索引結構體寫入 66 fwrite(&in1, sizeof(in1), 1, pfw); 67 } 68 69 fclose(pfr); 70 fclose(pfw); 71 printf("索引OK"); 72 system("pause"); 73 } 74 75 //比較兩個結構體 76 int com(void *p1, void *p2) 77 { 78 Index *pl1 = p1; 79 Index *pl2 = p2; 80 if (pl1->QQ >pl2->QQ) 81 { 82 return 1; 83 } 84 else if (pl1->QQ <pl2->QQ) 85 { 86 return -1; 87 } 88 else 89 { 90 return 0; 91 } 92 93 } 94 95 //讀取到結構體 96 void main() 97 { 98 FILE *pfr = fopen(indexpath, "rb"); 99 FILE *pfw = fopen(sortindexpath, "wb"); 100 //分配這麽多個索引結構體(包括qq號和位置),並讀取 101 Index *p = malloc(allN*sizeof(Index)); 102 fread(p, sizeof(Index), allN, pfr); 103 104 //對讀取的結構體進行排序 105 qsort(p, sizeof(Index), allN,com ); 106 107 //寫入 108 fwrite(p, sizeof(Index), allN, pfw); 109 110 //關閉文件 111 fclose(pfr); 112 fclose(pfw); 113 114 system("pause"); 115 }
68.qq號索引結構體寫入內存,並實現快速排序