大作业的一部分,写倒排求交算法并用数据测试,但老师给的数据不会用……
数据集描述(有ExpIndex与Expquery两个文件):
1、ExpIndex是二进制倒排索引文件,全部数据均为四字节无符号整数(小端)。格式为:
[数组1]长度,[数组1],[数组2]长度,[数组2]….
2、ExpQuery是文本文件,文件内每一行为一条查询记录;行中的每个数字对应索引文件的数组下标(term编号)。
注:ExpQuery文件在Windows系统下请使用写字板等工具打开。
要求是对ExpQuery中全部查询请求,进行列表(来自于ExpIndex)求交运算,计算平均响应时间和吞吐率。
想问一下这两个文件怎么样处理?主要是二进制文件应该怎么样操作使其存进一个个链表,谢谢。
数据集描述(有ExpIndex与Expquery两个文件):
1、ExpIndex是二进制倒排索引文件,全部数据均为四字节无符号整数(小端)。格式为:
[数组1]长度,[数组1],[数组2]长度,[数组2]….
2、ExpQuery是文本文件,文件内每一行为一条查询记录;行中的每个数字对应索引文件的数组下标(term编号)。
注:ExpQuery文件在Windows系统下请使用写字板等工具打开。
要求是对ExpQuery中全部查询请求,进行列表(来自于ExpIndex)求交运算,计算平均响应时间和吞吐率。
想问一下这两个文件怎么样处理?主要是二进制文件应该怎么样操作使其存进一个个链表,谢谢。
解决方案
40
仅供参考,不一定对:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> FILE *fi; struct _INDEX { unsigned short len; unsigned short *arr; } *idx; int MAXARRS=100; unsigned short i,alen; unsigned short *aarr; int j,n; int main() { fi=fopen("ExpIndex","rb"); if (NULL==fi) { printf("Can not open file ExpIndex!\n"); return 1; } idx=(struct _INDEX *)malloc(MAXARRS*sizeof(struct _INDEX)); if (NULL==idx) { printf("Can not malloc %d bytes for idx!\n",MAXARRS*sizeof(struct _INDEX)); return 2; } j=0; while (1) { fread(&alen,sizeof(unsigned short),1,fi); if (feof(fi)) break; aarr=(unsigned short *)malloc(alen*sizeof(unsigned short)); if (NULL==aarr) { printf("Can not malloc %d bytes for aarr!\n",alen*sizeof(unsigned short)); return 3; } for (i=0;i<len;i++) { fread(&aarr[i],sizeof(unsigned short),1,fi); if (feof(fi)) break; } if (feof(fi)) break; idx[j].len=alen; idx[j].arr=aarr; j++; if (j>=MAXARRS) { printf("Too many arrays(>=%d)!\n",MAXARRS); break; } } fclose(fi); n=j; for (j=0;j<n;j++) { printf("j=%03d ",j); printf("len=%03d",idx[j].len); for (i=0;i<len;i++) printf(" %hu",idx[j].arr[i]); printf("\n"); } for (j=0;j<n;j++) free(idx[j].arr); free(idx); return 0; }