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     //遍历,把所有'#'转化成''
     5     for (char *p = str; *p != ''; p++)
     6     {
     7         if (*p == '#')
     8         {
     9             *p = '';
    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     //遍历,把所有'#'转化成''
     5     for (char *p = str; *p != '';p++)
     6     {
     7         if (*p=='#')
     8         {
     9             *p = '';
    10         }
    11     }
    12     //把姓名copy到结构体中
    13     strcpy(pdata->name, str);
    14     //加字符串长度到字符串后一位'',再加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("
    %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     //遍历,把所有'#'转化成''
 24     for (char *p = str; *p != '';p++)
 25     {
 26         if (*p=='#')
 27         {
 28             *p = '';
 29         }
 30     }
 31     //把姓名copy到结构体中
 32     strcpy(pdata->name, str);
 33     //加字符串长度到字符串后一位'',再加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     //遍历,把所有'#'转化成''
 46     for (char *p = str; *p != ''; p++)
 47     {
 48         if (*p == '#')
 49         {
 50             *p = '';
 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("
%s,%s,%s", csdn1.name, csdn1.password, csdn1.email);
131     }
132     fclose(pf);
133     system("pause");
134 }
原文地址:https://www.cnblogs.com/xiaochi/p/8437021.html