68.qq号索引结构体写入内存,并实现快速排序

  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 }

原文地址:https://www.cnblogs.com/xiaochi/p/8445869.html

时间: 2024-10-28 20:47:32

68.qq号索引结构体写入内存,并实现快速排序的相关文章

结构体,内存,指针例题.DOC

2015.1.30 递归函数:1.自身调用自己:2.要有结束条件!typedef 后面加分号:一般后面的重定义名加_,例如:typedef unsigned long int uint_16;结构体成员存放是不重叠的,但是结构体变量内存会重叠,可以节省内存空间! 字节对其对cpu运行效率有影响.底层的时候要注意这个问题有效对齐:min(自身对齐,指定对齐)结构体自身对齐:max(成全自身对齐)圆整:结构体自身对齐 % 有效对齐 == 0: int a[10] = {....} 后面的是初始化表,

C语言 结构体的内存对齐问题与位域

http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对 齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽 松).这种强制的要求一来简化了处

结构体在内存中的存储方式

结构体在内存中如何存储? 遵循结构体对齐规则: 1.首先要知道默认对齐数:VS 中 8   Linux 中4 2.第一个成员放到0偏移处 3.后面所有的成员都放到对齐数(本身和默认对齐数的较小值)的倍数处偏移 4.结构体总大小为所有对齐数中最大对齐数的倍数 Eg: 运行结果为 24 图中可以看出内存有浪费,而我们将小的成员放一起可以节省资源 减少浪费. 上例可以改为: int i: char c: double d: 这样总大小只需16 节省浪费. 空的结构体类型大小为1,创建对象需要开辟空间,

结构体的内存空间分配及字节对齐

关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,那

结构体的内存空间分配原理

关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因 为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,

【转】结构体的内存空间分配原理

关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因 为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,

VC中结构体的内存布局

看了 VC++中内存对齐 这篇文章,感觉说复杂了,根据我的总结,要算出结构体的内存大小和偏移量,只要清楚结构体各成员的内存布局就行了,下面介绍一下我总结的规则,有不对之处,欢迎回复. 1.实际PACK值根据默认值.声明值.成员值的最小值得到.默认值在32位系统中为4,声明值则是使用#pragma pack(n)声明的值,如没有则忽略,成员最小值则是指结构体中最大的一个数据类型的大小,如int为4,short为2...,举例: #pragma pack(8) struct sta { char a

结构体指针内存——指针数组——字符串指针内存申请

前几天用的结构体,结构体内还包含有结构体指针和数组以及指向字符串的指针,发现自己对这方面的东西还很容易犯错,故现在讲其中容易出错的地方写出来,分享给大家也方便自己日后查看. typedef struct { char name[50]; char job[50]; int age; int people_id; } peopleInfo; typedef struct { bool typeAdd; bool typeDel; int length; peopleInfo *info; char

C语言结构体占用空间内存大小解析

结构体的数据类型的有点我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧. 格式一: [cpp] view plain copy 01.struct tagPhone 02.{ 03.     char   A; 04.     int    B; 05.     short  C; 06.}Phone; [cpp] view plain copy 格式二: [cpp] view plain copy 01.struct tagPhone 02.{ 03.     char   A; 04