filesort.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:4k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define NUM 4
  5. struct data
  6. {
  7. char name[20];
  8. char school[20];
  9. char city[20];
  10. char province[20];
  11. }info;
  12. struct data addrs[NUM]=
  13. {
  14. "WenHai","BIT","JiLin","JiLin",
  15. "TongWei","BIT","ZhengJiang","JiangSu",
  16. "SunYou","BIT","WeiFang","ShangDong",
  17. "XiaoMing","PKU","TaiYuan","ShanXi"
  18. };
  19. /*对后面要用到的函数进行声明*/
  20. void quick_disk(FILE *fp,int count);
  21. void qs_disk(FILE *fp,int left,int right);
  22. void exchangedata(FILE *fp,long i, long j);
  23. char *get_name(FILE *fp, long rec);
  24. void print_data(struct data *p);
  25. struct data *get_data(FILE *fp,long rec);
  26. int main(void)
  27. {
  28. int i;
  29. FILE *fp; /*文件指针*/
  30. /*以读写方式生成文本文件fp*/
  31. if((fp = fopen("datalist.txt","w+")) == NULL)
  32. {
  33. printf("打开文件失败n");
  34. exit(1);
  35. }
  36. printf("将未排序的数据写入文件n");
  37. /*将数组Sdata[NUM]写入文件中*/
  38. fwrite(addrs,sizeof(addrs),1,fp);
  39. /*将文件中的数组Sdata[NUM]依次取出并打印*/
  40. for(i=0;i<NUM;i++)
  41. {
  42. struct data *p;
  43. p = get_data(fp,i); /*得到Sdata[i]的指针*/
  44. print_data(p); /*将结构体Sdata[i]各个成员变量打印出*/
  45. printf("n");
  46. }
  47. fclose(fp); /*关闭文件指针*/
  48. /*以二进制方式再次打开文件datalist.txt*/
  49. if((fp=fopen("datalist.txt","rb+"))==NULL)
  50. {
  51. printf("不能以读写方式打开文件n");
  52. exit(1);
  53. }
  54. printf("将文件数据排序n");
  55. /*调用字符串排序函数将文本中的字符串结构体排序*/
  56. quick_disk(fp,NUM);
  57. printf("排序结束n");
  58. /*将排序结束后的数组数据打印出来*/
  59. for(i=0;i<4;i++)
  60. {
  61. struct data *p;
  62. p = get_data(fp,i);
  63. print_data(p);
  64. printf("n");
  65. }
  66. fclose(fp);
  67. return 0;
  68. }
  69. /*应用快速排序方法对字符串进行排序*/
  70. void quick_disk(FILE *fp,int count)
  71. {
  72. qs_disk(fp,0,count-1);
  73. }
  74. /*排序函数*/
  75. void qs_disk(FILE *fp,int left,int right)
  76. {
  77. long int i,j;
  78. char x[30];
  79. i = left;
  80. j = right;
  81. /*比较字符串x为Sdata数组中间一个结构变量的name成员变量*/
  82. strcpy(x,get_name(fp,(long)(i+j)/2));
  83. do
  84. { /*比较当前结构变量的name成员变量于比较字符串x的大小*/
  85. while((strcmp(get_name(fp,i),x)<0)&&(i<right))
  86. i++;
  87. while((strcmp(get_name(fp,j),x)>0)&&(j>left))
  88. j--;
  89. if(i<=j)
  90. {
  91. exchangedata(fp,i,j); /*交换i和j对应的数据*/
  92. i++;
  93. j--;
  94. }
  95. }while(i<j);
  96. if(left<j) /*反复调用此排序函数,直到j达到数据的最左端*/
  97. qs_disk(fp,left,(int)j);
  98. if(i<right) /*反复调用此排序函数,直到i达到数据的最右端*/
  99. qs_disk(fp,(int)i,right);
  100. }
  101. /*交换i和j在文件中对应的数据*/
  102. void exchangedata(FILE *fp,long i,long j)
  103. {
  104. char a[sizeof(info)],b[sizeof(info)];
  105. fseek(fp,sizeof(info)*i,SEEK_SET); /*找到i在文件中对应的数据位置*/
  106. fread(a,sizeof(info),1,fp); /*将该位置数据读到字符串数组a中*/
  107. fseek(fp,sizeof(info)*j,SEEK_SET); /*找到j在文件中对应的数据位置*/
  108. fread(b,sizeof(info),1,fp); /*将该位置数据读到字符串数组b中*/
  109. fseek(fp,sizeof(info)*j,SEEK_SET); /*找到j在文件中对应的数据位置*/
  110. fwrite(a,sizeof(info),1,fp); /*将刚才读入a中的数据写入到该位置*/
  111. fseek(fp,sizeof(info)*i,SEEK_SET); /*找到i在文件中对应的数据位置*/
  112. fwrite(b,sizeof(info),1,fp); /*将刚才读入b中的数据写入到该位置*/
  113. /*完成文件中i和j处对应数据的交换*/
  114. }
  115. /*得到文件fp中变量rec对应的结构体变量的name成员变量*/
  116. char *get_name(FILE *fp,long rec)
  117. {
  118. struct data *p;
  119. p = &info;
  120. rewind(fp);
  121. /*找到该结构体变量得的位置*/
  122. fseek(fp,rec*sizeof(struct data),SEEK_SET);
  123. /*将其读到指针p*/
  124. fread(p,sizeof(struct data),1L,fp);
  125. return p->name; /*返回该结构体变量的name成员变量*/
  126. }
  127. /*得到文件fp中变量rec对应的结构体变量的指针*/
  128. struct data *get_data(FILE *fp,long rec)
  129. {
  130. struct data *p;
  131. p = &info;
  132. rewind(fp);
  133. /*找到该结构体变量得的位置*/
  134. fseek(fp,rec*sizeof(info),SEEK_SET);
  135. /*将其读到指针p*/
  136. fread(p,sizeof(info),1,fp);
  137. return p; /*返回该结构体指针*/
  138. }
  139. /*将指针p对应的结构体的各个成员变量打印出来*/
  140. void print_data(struct data *p)
  141. {
  142. printf("姓名:%sn",p->name);
  143. printf("学校:%sn",p->school);
  144. printf("城市:%sn",p->city);
  145. printf("省  :%sn",p->province);
  146. }