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();    
原文地址:https://www.cnblogs.com/xiaochi/p/8437114.html