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 //把换行替换为'\0'
     2 void eatN(char *str)
     3 {
     4     while (*str!='\0')
     5     {
     6         if (*str=='\r' || *str=='\n')
     7         {
     8             *str = '\0';
     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经过消除'\n'处理,所以要加入\n
    10         sprintf(temp, "%s\n", g_pp[i]);
    11         //写入到文件
    12         fputs(temp, pf);
    13     }
    14     fclose(pf);
    15 }

     

  • 打印状态
    1 void show()
    2 {
    3     printf("\n此时状态\n");
    4     for (int i = 0; i < N;i++)
    5     {
    6         printf("\n%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();    

     

posted @ 2018-02-09 23:08  喵小喵~  阅读(279)  评论(0编辑  收藏  举报