文件索引
来源:互联网 发布:网络视听许可证 youku 编辑:程序博客网 时间:2024/05/17 08:12
索引的作用(为什么要有索引?):
当要对大数据文件进行随机 读取时,一种方法是先全部读入内存,以数组形式存储,通过数组索引下标形式进行访问,
缺点是要占用大量的内存,我们知道对计算机而言内存是相当宝贵的。
另一种方法就是建立文件索引,通过文件索引查找数据。思路:把每一行字符串的数据首地址记录下来,存入数组,再通过文件指针访问数组中的存储地址所指向的数据。
程序步骤
1.读取文件中一共有多少行数据
2.得到每行数据在文件中的地址
3.写入索引文件
4.载入索引文件到内存或者直接从索引文件读取每行数据所在的地址
5.随机读取想要读取的行数
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>char path[256] = "D:\\C++\\test.txt";char indexpath[256] = "D:\\C++\\index.txt";#define N 8000000 //通过getN()得到行数struct index{int *pindex; //地址int length; //长度}allindex;int getN() //得到行数{int i = 0;FILE *pf = fopen(path, "rb");if (pf == NULL){return -1;}else{int i = 0;int alllength = 0;while (!feof(pf)){char str[50] = { 0 };fgets(str, 50, pf);i++;}//printf("\n all = %d", alllength);fclose(pf);return i;}}void init(char *path) // 生成索引并写入到文件{printf("索引数组开始分配 \n");allindex.length = N;allindex.pindex = calloc(N, sizeof(int));printf("索引数组完成分配 \n");printf("开始读取 \n");FILE *pf = fopen(path, "rb");if (pf == NULL){return -1;}else{int alllength = 0;for (int i = 0; i < N; i++){char str[50] = { 0 };fgets(str, 50, pf);allindex.pindex[i] = alllength;int length = strlen(str);alllength += length;}fclose(pf);}printf("\n 结束读取");printf("\n 开始写入");FILE *pfw = fopen(indexpath, "wb"); //写入索引fwrite(allindex.pindex, sizeof(int), allindex.length, pfw);fclose(pfw);printf("\n 结束写入");free(allindex.pindex);}void readindex() // 读取索引文件到内存{printf("索引数组开始分配 \n");allindex.length = N;allindex.pindex = calloc(N, sizeof(int));printf("索引数组完成分配 \n");printf("\n 开始读取");FILE *pfw = fopen(indexpath, "rb"); //写入索引fread(allindex.pindex, sizeof(int), allindex.length, pfw);fclose(pfw);printf("\n 结束读取");}void main() //通过读索引到内存,再访问大数据文件读取数据{init(path);readindex();FILE *pf = fopen(path, "rb");while (1){printf("请输入要读取的行数");int num = 0;scanf("%d", &num);fseek(pf, allindex.pindex[num], SEEK_SET);char str[128] = { 0 };fgets(str, 128, pf);printf("%s", str);}printf("%d", getN());system("pause");}void main1() //生成好索引后,直接从索引文件读取数据地址,再访问大数据文件读取数据{FILE *pf1 = fopen(indexpath, "rb");FILE *pf2 = fopen(path, "rb");while (1){printf("请输入要读取的行数");int num = 0;scanf("%d", &num);int indexnum = 0;fseek(pf1,num *sizeof(int), SEEK_SET);fread(&indexnum, sizeof(int), 1, pf1);//读索引fseek(pf2, indexnum, SEEK_SET);char str[128] = { 0 };fgets(str, 128, pf2);printf("%s", str);}system("pause");}
1 0
- 索引文件
- 文件索引
- 索引文件
- 文件索引
- 文件之索引文件
- 数据库索引 - 顺序文件索引
- 索引文件构成
- lucene的索引文件
- 文件索引结构
- lucene的索引文件
- 文件建立索引列表
- 源程序文件索引表
- mysql 修复索引文件
- 索引文件的操作
- 索引文件结构
- 分布式索引文件内容
- 索引顺序文件
- 索引文件的操作
- AngularJS中关于ng-class指令的几种实现方式详解
- mysql数据库之navicat图形化管理工具的使用
- 【VB.NET】浅谈VB与VB.NET的关系
- html css 居中总结
- HTTP代理原理以及HTTP隧道技术
- 文件索引
- C++文件操作
- OpenCV提取图像颜色直方图+cvCreateHist
- Qt const
- 六,iOS中的金额格式化和金额大小写转换
- Tomcat 7服务器线程模型
- 一个数据包的互联网漫游记
- SSH、SSM整合一览
- 最新产品 L1频段卫星导航射频前端低噪声放大器芯片AT2659