- 创建全局变量 二级指针 指向多个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();
转载于:https://www.cnblogs.com/xiaochi/p/8437114.html