Code Bye

怎么样读取给定二进制倒排索引文件存入数据结构(如链表)

大作业的一部分,写倒排求交算法并用数据测试,但老师给的数据不会用……
数据集描述(有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;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么样读取给定二进制倒排索引文件存入数据结构(如链表)