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 }