• 58.大数据读入内存快速排序并写入内存,创建排序好的文件


    • 创建全局变量 二级指针 指向多个char *
      1 //针数组,指向所有的行
      2 char **g_pp;
    • 创建一个全局变量,标识一共有多少行,行数要提前获取
      1 //文件中含有的行数
      2 #define N 28
       1 //获取文件的行数
       2 int getN()
       3 {
       4     //打开文件
       5     FILE *pf = fopen("file.txt", "r");
       6     if (pf==NULL)
       7     {
       8         return -1;
       9     } 
      10     //统计有多少行
      11     else
      12     {
      13         int i = 0;
      14         while (!feof(pf))
      15         {
      16             char str[50] = { 0 };
      17             fgets(str, 50, pf);//读取
      18             i++;
      19         }
      20         fclose(pf);
      21         return i;
      22 
      23     }
      24 }
    • 分配内存并写入到内存中
       1 //分配内存
       2 void initmem()
       3 {
       4     //分配指针数组
       5     g_pp = calloc(N, sizeof(char*));
       6     //打开文件
       7     FILE *pf = fopen("file.txt", "r");
       8 
       9     //如果打开成功
      10     if (pf == NULL)
      11     {
      12         return -1;
      13     }
      14     else
      15     {
      16         //按行读取
      17         for (int i = 0; i < N; i++)
      18         {
      19             char str[50] = { 0 };
      20             //读取一行
      21             fgets(str, 50, pf);
      22 
      23             //分配内存 (读取时候把/r/n读取成/n,所以要加1)
      24             g_pp[i] = calloc(strlen(str) + 1, sizeof(char));
      25             //打印进去
      26             sprintf(g_pp[i], str);
      27             //把打印进去的数据进行格式化处理
      28             eatN(g_pp[i]);
      29             //显示测试
      30             printf("%s", g_pp[i]);
      31         }
      32         //关闭文件
      33         fclose(pf);
      34     }
      35 }
    • 字符串格式化处理
       1 //把换行替换为''
       2 void eatN(char *str)
       3 {
       4     while (*str!='')
       5     {
       6         if (*str=='
      ' || *str=='
      ')
       7         {
       8             *str = '';
       9         }
      10 
      11         str++;
      12     }
      13 
      14 }
    • 把写入内存中的数据进行快速排序
      1 //快速排序
      2 void sort()
      3 {
      4     //传递g_pp进去进行排序,每一个元素的大小都是sizeof(char *)的大小 (指向一个字符串)
      5     qsort(g_pp, N, sizeof(char*), com);
      6 }
    • 比较函数
       1 //快速排序的比较函数
       2 int com(void *p1, void*p2)
       3 {
       4     //因为传进去的是二级指针,所以要转换成二级指针
       5     //(二级指针指向很多个字符串,每个字符串都是一个一级指针)
       6     char **pp1 = p1;
       7     char **pp2 = p2;
       8     //大于返回1,小于返回-1,等于返回0
       9     return strcmp(*pp1, *pp2);
      10 }
    • 将g_pp写入到文件中
       1 //把g_pp写入到文件
       2 void writetofile()
       3 {
       4     FILE *pf = fopen("filesort.txt", "w");
       5 
       6     for (int i = 0; i < N;i++)
       7     {
       8         char temp[100] = { 0 };
       9         //因为g_pp经过消除'
      '处理,所以要加入
      
      10         sprintf(temp, "%s
      ", g_pp[i]);
      11         //写入到文件
      12         fputs(temp, pf);
      13     }
      14     fclose(pf);
      15 }
    • 打印状态
      1 void show()
      2 {
      3     printf("
      此时状态
      ");
      4     for (int i = 0; i < N;i++)
      5     {
      6         printf("
      %s", g_pp[i]);
      7     }
      8 }
    • main函数测试
      1         int num = 0;
      2     scanf("%d", &num);
      3     printf("%d", getN());
      4     initmem();
      5     sort();
      6     show();
      7     writetofile();    
  • 相关阅读:
    微信报警提示
    使用pygal图表显示网站API接口数据
    读写文本文件,乱码解决方案
    MD5加密
    将DataTable导入到SQL数据库表中
    NPOI组件操作Excel导入、导出
    二叉树由先序和中序建树
    用两个栈模拟队列
    math type白嫖教程
    IDEA常用快捷键
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8437114.html
Copyright © 2020-2023  润新知