• 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 }
  • 相关阅读:
    js制作倒计时
    SpringBoot tomcat 上传文件大小受限制1M,解决办法
    SQL关于not,exists说法,以及差异
    SQL语句关于树查询
    树(Tree)形插件
    python之函数用法fromkeys()
    模块
    补充零散知识
    pickle模块
    python中元组与列表的区别
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8437021.html
Copyright © 2020-2023  润新知