索引与文本文件
1.索引
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //获取多少行,创建数组a[N] //获取每一行的宽度a[N]=width //读取的每一个字符串都有 struct index { int *pindex; int length; }allindex; int getN() { int i = -1; FILE *pf = fopen("test.txt", "rb");// -> if (pf==NULL) { return -1; } else { int alllength = 0; i = 0; while (!feof(pf)) { char str[50] = { 0 }; fgets(str, 50, pf); alllength += strlen(str); printf("%d %d %s ",strlen(str),i, str); i++; } printf(" all=%d", alllength); fclose(pf); return i; } } void initindex() { int i = -1; FILE *pf = fopen("test.txt", "rb");// -> if (pf == NULL) { return -1; } else { int alllength = 0; i = 0; while (!feof(pf)) { char str[50] = { 0 }; fgets(str, 50, pf); allindex.pindex[i] = alllength; alllength += strlen(str); printf(" i=%d,index[%d]=%d,with=%d", i, i, allindex.pindex[i], strlen(str)); i++; } fclose(pf); return i; } } void main() { allindex.length = getN(); printf(" hang=%d", allindex.length); allindex.pindex = calloc(allindex.length, sizeof(int)); initindex(); FILE *pf = fopen("test.txt", "rb"); while (1) { int num = 0; scanf("%d", &num); fseek(pf,allindex.pindex[num] , SEEK_SET); char str[128] = { 0 }; fgets(str, 128, pf);//读取 printf("%s", str); } fclose(pf); system("pause"); }
2.大数据索引
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //读取大数据多少行 //int a[N] ,堆上 //写入到文件 //索引文件载入内存 //随机读 char path[256] = "Z:\I\尹成清华终极版C语言视频源码文档20150131\大数据相关数据\1E~001OK.txt"; char indexpath[256] = "Z:\I\尹成清华终极版C语言视频源码文档20150131\大数据相关数据\1Eindex.txt"; #define N 84331542 struct index { int *pindex;//地址 int length;//长度 }allindex; void init(char *path) { printf(" 索引数组开始分配"); allindex.length = N; allindex.pindex = calloc(N, sizeof(int));//分配内存 printf(" 索引数组完成分配"); printf(" 开始读取"); 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;//错位从0开始 int length = strlen(str); alllength += length; } fclose(pf); } printf(" 结束读取"); printf(" 开始写入"); FILE *pfw = fopen(indexpath, "wb");//写入索引 fwrite(allindex.pindex, sizeof(int), allindex.length, pfw); fclose(pfw);//关闭 printf(" 结束写入"); free(allindex.pindex); printf(" 开始读取"); FILE *pfr1 = fopen(indexpath, "rb");//写入索引 fread(allindex.pindex, sizeof(int), allindex.length, pfr1); fclose(pfr1);//关闭 printf(" 结束读取"); } void qucik() { printf(" 索引数组开始分配"); allindex.length = N; allindex.pindex = calloc(N, sizeof(int));//分配内存 printf(" 索引数组完成分配"); printf(" 开始读取"); FILE *pfw = fopen(indexpath, "rb");//写入索引 fread(allindex.pindex, sizeof(int), allindex.length, pfw); fclose(pfw);//关闭 printf(" 结束读取"); } int getN(char *path) { int i = -1; FILE *pf = fopen(path, "rb");// -> if (pf == NULL) { return -1; } else { i = 0; while (!feof(pf)) { char str[50] = { 0 }; fgets(str, 50, pf); i++; } fclose(pf); return i; } } void main1x() { //printf("%d", getN(path)); //init(path); qucik(); 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); } fclose(pf); system("pause"); } void main() { 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);//读索引到indexnum fseek(pf2, indexnum, SEEK_SET); char str[128] = { 0 }; fgets(str, 128, pf2);//读取 printf(" %s", str); } fclose(pf1); fclose(pf2); system("pause"); }