索引文件的建立与查询示例(二)

索引文件的建立与查询示例(二)
我们在建立索引之前,需要对计算机各变量所占的内存大小有一个初步的了解,比如结构体内有不同的变量构成,在写入文件时会根据变量的大小进行文件内空间大小的占用。所以,以什么样的格式写入文件,就以什么样的格式从文件中读出。在写入文件前,通过测试对占用内存大小进行展示,进一步理解存储的空间占用。

writeFile.cpp//写入文件测试

#include <stdio.h>
#define SIZE 4
static struct student_type
{
char name[10];
int num;
int age;
char addr[15];
 } stud[SIZE];

 void save()
 {
 FILE *fp;
 int i;
 if((fp=fopen("d:/file.dat","wb"))==NULL)
 {
     printf("cannot open file \n");
    return;
     }

     for (i=0;i<SIZE;i++)
       {
        scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
       }

     for (i=0;i<SIZE;i++)
     {
        printf("student_type[%d] size is %d \n",i,sizeof(stud[i]));
        printf("stud[%d].name size is %d \n ",i,sizeof(stud[i].name));
        printf("stud[%d].num size is %d \n ",i,sizeof(stud[i].num));
        printf("stud[%d].age size is %d \n ",i,sizeof(stud[i].age));
        printf("stud[%d].addr size is %d \n ",i,sizeof(stud[i].addr));
        printf("student_type[%d] size is %d \n",i,sizeof(struct student_type));
        if (fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
        printf("file write error \n");
     }
 }

writeFile.h

#ifndef WRITEFILE_H_INCLUDED
#define WRITEFILE_H_INCLUDED
void save();
#endif // WRITEFILE_H_INCLUDED

main.cpp

#include <iostream>
#include "method.h"
//#include "index.h"
//#include "readFile.h"
#include "writeFile.h"
//#include "indexFile.h"
using namespace std;
#include "point.h"


int main()
{

    cout << "Hello world!" << endl;
    /*此处添加调用函数的内容*/
    save();
     int i=6;
     int j=66666;
     printf("i %d 的占用长度是%d \n",i,sizeof(i));
     printf("j %d 的占用长度是%d \n" ,j,sizeof(j));

    system("pause");
    return 0;
}

测试一下理论部分
在这里插入图片描述
通过测试验证,看到结构体内的各变量占用内存大小分别是10字节、4字节、4字节、15字节,理论上结构体大小应该是10+4+4+15=33字节,但实际上结构体占用内存分配的大小是36字节,系统按4字节的单元进行内存分配,多余出的3字节也被预占了。
通过本例,我们得出分配给结构体的大小一定大于等于各变量大小之和。

C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。在结构体中,编译器为结构体的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相同。  编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。
若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。
–这点我们在后面进行测试。

编译器缺省的结构整体的自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为“结构整体自然对界条件的整数倍”,则在最后一个成员后填充空字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值