索引文件的建立与查询示例(二)
我们在建立索引之前,需要对计算机各变量所占的内存大小有一个初步的了解,比如结构体内有不同的变量构成,在写入文件时会根据变量的大小进行文件内空间大小的占用。所以,以什么样的格式写入文件,就以什么样的格式从文件中读出。在写入文件前,通过测试对占用内存大小进行展示,进一步理解存储的空间占用。
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字节对齐。
若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。
–这点我们在后面进行测试。
编译器缺省的结构整体的自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为“结构整体自然对界条件的整数倍”,则在最后一个成员后填充空字节。