57.大数据线性处理csdn数据(fread,fwrite) 百万数据秒读数据
- 创建结构体存储csdn数据
1 struct csdn 2 { 3 char name[22]; 4 char password[43]; 5 char email[52]; 6 7 };
- 对于分配的大小要先获取最大的长度,定义如下
1 //姓名最大长度 2 int namemax = -1; 3 //密码最大长度 4 int passmax = -1; 5 //邮件最大长度 6 int mailmax = -1;
1 //获取各部分最大长度 2 void getmax(char *str) 3 { 4 //遍历,把所有'#'转化成'\0' 5 for (char *p = str; *p != '\0'; p++) 6 { 7 if (*p == '#') 8 { 9 *p = '\0'; 10 } 11 } 12 //max1:姓名的长度 13 int max1 = strlen(str); 14 if (max1>namemax) 15 { 16 namemax = max1; 17 } 18 //max2:密码的长度 19 char *pstr1 = str + strlen(str) + 1; 20 int max2 = strlen(pstr1); 21 if (max2>passmax) 22 { 23 passmax = max2; 24 } 25 26 //max3:email的长度 27 char *pstr2 = pstr1 + strlen(pstr1) + 1; 28 int max3 = strlen(pstr2); 29 if (max3>mailmax) 30 { 31 mailmax = max3; 32 } 33 }
- fgets读取到的数据写入到结构体中
1 //字符串初始化结构体 2 void init(struct csdn *pdata, char *str) 3 { 4 //遍历,把所有'#'转化成'\0' 5 for (char *p = str; *p != '\0';p++) 6 { 7 if (*p=='#') 8 { 9 *p = '\0'; 10 } 11 } 12 //把姓名copy到结构体中 13 strcpy(pdata->name, str); 14 //加字符串长度到字符串后一位'\0',再加1到下一个字符串起始位置 15 char *pstr1 = str + strlen(str) + 1; 16 //把密码copy到结构体中 17 strcpy(pdata->password, pstr1); 18 char *pstr2 = pstr1 + strlen(pstr1) + 1; 19 //把email copy到结构体中 20 strcpy(pdata->email, pstr2); 21 }
- 读取文件并写入到结构体中,然后在把结构体写到文件中
1 //写入数据 2 void readfiletxt() 3 { 4 //读取文件 5 FILE *pfr = fopen("csdn.txt", "r"); 6 //以二进制方式写文件 7 FILE *pfw = fopen("csdn.bin", "wb"); 8 9 //如果打开失败则返回 10 if (pfr==NULL) 11 { 12 return; 13 } 14 //否则写数据 15 else 16 { 17 //如果没有到文件末尾 18 while (!feof(pfr)) 19 { 20 //存取读取到的数据 21 char str[256] = { 0 }; 22 //读取一行 23 fgets(str, 256, pfr); 24 //创建结构体 25 struct csdn csdn1; 26 //把读取到到的数据写到结构体中 27 init(&csdn1, str); 28 //把结构体写入文件 29 fwrite(&csdn1, sizeof(struct csdn), 1, pfw);//写入 30 } 31 32 } 33 //关闭文件 34 fclose(pfr); 35 fclose(pfw); 36 }
- 测试代码
1 void main() 2 { 3 4 FILE *pf = fopen("csdn.bin", "rb+"); 5 while (1) 6 { 7 printf("请输入你要读取的第N个元素:"); 8 int N; 9 scanf("%d", &N); 10 11 12 struct csdn csdn1 = {0}; 13 //移动到相应的结构体位置(注意:fwrite写入的必须是同一种类的,这样才好读取) 14 fseek(pf, sizeof(struct csdn)*(N - 1), SEEK_SET); 15 //读取 16 fread(&csdn1, sizeof(struct csdn), 1, pf); 17 //输出结果 18 printf("\n%s,%s,%s", csdn1.name, csdn1.password, csdn1.email); 19 } 20 fclose(pf); 21 system("pause"); 22 }
完整代码:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 //csdn结构体 6 struct csdn 7 { 8 char name[22]; 9 char password[43]; 10 char email[52]; 11 12 }; 13 //姓名最大长度 14 int namemax = -1; 15 //密码最大长度 16 int passmax = -1; 17 //邮件最大长度 18 int mailmax = -1; 19 20 //字符串初始化结构体 21 void init(struct csdn *pdata, char *str) 22 { 23 //遍历,把所有'#'转化成'\0' 24 for (char *p = str; *p != '\0';p++) 25 { 26 if (*p=='#') 27 { 28 *p = '\0'; 29 } 30 } 31 //把姓名copy到结构体中 32 strcpy(pdata->name, str); 33 //加字符串长度到字符串后一位'\0',再加1到下一个字符串起始位置 34 char *pstr1 = str + strlen(str) + 1; 35 //把密码copy到结构体中 36 strcpy(pdata->password, pstr1); 37 char *pstr2 = pstr1 + strlen(pstr1) + 1; 38 //把email copy到结构体中 39 strcpy(pdata->email, pstr2); 40 } 41 42 //获取各部分最大长度 43 void getmax(char *str) 44 { 45 //遍历,把所有'#'转化成'\0' 46 for (char *p = str; *p != '\0'; p++) 47 { 48 if (*p == '#') 49 { 50 *p = '\0'; 51 } 52 } 53 //max1:姓名的长度 54 int max1 = strlen(str); 55 if (max1>namemax) 56 { 57 namemax = max1; 58 } 59 //max2:密码的长度 60 char *pstr1 = str + strlen(str) + 1; 61 int max2 = strlen(pstr1); 62 if (max2>passmax) 63 { 64 passmax = max2; 65 } 66 67 //max3:email的长度 68 char *pstr2 = pstr1 + strlen(pstr1) + 1; 69 int max3 = strlen(pstr2); 70 if (max3>mailmax) 71 { 72 mailmax = max3; 73 } 74 } 75 76 //写入数据 77 void readfiletxt() 78 { 79 //读取文件 80 FILE *pfr = fopen("csdn.txt", "r"); 81 //以二进制方式写文件 82 FILE *pfw = fopen("csdn.bin", "wb"); 83 84 //如果打开失败则返回 85 if (pfr==NULL) 86 { 87 return; 88 } 89 //否则写数据 90 else 91 { 92 //如果没有到文件末尾 93 while (!feof(pfr)) 94 { 95 //存取读取到的数据 96 char str[256] = { 0 }; 97 //读取一行 98 fgets(str, 256, pfr); 99 //创建结构体 100 struct csdn csdn1; 101 //把读取到到的数据写到结构体中 102 init(&csdn1, str); 103 //把结构体写入文件 104 fwrite(&csdn1, sizeof(struct csdn), 1, pfw);//写入 105 } 106 107 } 108 //关闭文件 109 fclose(pfr); 110 fclose(pfw); 111 } 112 113 void main() 114 { 115 116 FILE *pf = fopen("csdn.bin", "rb+"); 117 while (1) 118 { 119 printf("请输入你要读取的第N个元素:"); 120 int N; 121 scanf("%d", &N); 122 123 124 struct csdn csdn1 = {0}; 125 //移动到相应的结构体位置(注意:fwrite写入的必须是同一种类的,这样才好读取) 126 fseek(pf, sizeof(struct csdn)*(N - 1), SEEK_SET); 127 //读取 128 fread(&csdn1, sizeof(struct csdn), 1, pf); 129 //输出结果 130 printf("\n%s,%s,%s", csdn1.name, csdn1.password, csdn1.email); 131 } 132 fclose(pf); 133 system("pause"); 134 }