免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: daworld
打印 上一主题 下一主题

[求助]有没有朋友实现过类似sort命令的功能 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-03-12 18:38 |只看该作者

论坛徽章:
0
12 [报告]
发表于 2007-03-12 22:05 |只看该作者

代码完成

在大家的帮助下,完成了代码。
现在拿出来让大家看一下,希望多提宝贵意见。


  1. #include "ourhdr.h"
  2. #include <assert.h>

  3. #define MAXLEN         1024

  4. int file_cnt;

  5. static int
  6. gen_file_list(char *path, char *recname)
  7. {
  8.         char cmdstr[MAXLEN] = {0};
  9.         char fname[MAXLEN] =  {0};
  10.         char abs_fname[MAXLEN] =  {0};
  11.         char buffer[MAXLEN] = {0};
  12.         char del_fname_unsort[MAXLEN] = {0};
  13.         unsigned long fsize = 0;
  14.         FILE *fp = NULL, *fpdel = NULL;
  15.        
  16.         assert( path && recname );
  17.        
  18.         memset(cmdstr, 0, 256);
  19.         sprintf(cmdstr, "ls -1str %s | grep _%s_ > /tmp/file_list_tmp.txt", path, recname);
  20.         system(cmdstr);
  21.         sprintf(del_fname_unsort, "/tmp/tmp_delete_%s_unsort", recname);
  22.        
  23.         if( (fp=fopen("/tmp/file_list_tmp.txt", "r")) == NULL ){
  24.                 printf("Error: fail to open the file_list_tmp.txt\n");
  25.                 return -1;
  26.         }
  27.        
  28.         if( (fpdel=fopen(del_fname_unsort, "a+")) == NULL ){
  29.                 printf("Error: fail to open the %s\n", del_fname_unsort);
  30.                 return -2;
  31.         }
  32.        
  33.         while( !feof(fp) ) {
  34.                 memset(buffer, 0, MAXLEN);
  35.                 memset(fname, 0, MAXLEN);
  36.                 memset(abs_fname, 0, MAXLEN);
  37.                 fsize = 0;
  38.                 fgets(buffer, MAXLEN, fp);
  39.                 if( !strcmp(buffer, "") ) break;
  40.                 if( sscanf(buffer, "%ld %s", &fsize, fname) != 2 ){
  41.                         printf("Error: sscanf().\n");
  42.                         continue;
  43.                 }
  44.                 sprintf(abs_fname, "%s/%s", path, fname);
  45.                 fprintf(fpdel, "%ld %s\n", fsize, abs_fname);
  46.                 file_cnt++;
  47.         }
  48.        
  49.         fcloseall();
  50.             remove("/tmp/file_list_tmp.txt");
  51.         return 0;
  52. }

  53. /* swap:  interchange v[i] and v[j] */
  54. void
  55. swap(char *v[], int i, int j)
  56. {
  57.         char *temp;
  58.        
  59.         temp = v[i];
  60.         v[i] = v[j];
  61.         v[j] = temp;
  62.         //printf("v[i]: %s\n", v[i]);
  63.         //printf("v[j]: %s\n", v[j]);
  64. }

  65. /* compare:  return <0 if s<t, 0 if s==t, >0 if s>t */
  66. //4844 /mnt/USB1/C:/folderA/axis-test/AXIS207_axis-test_2007-03-09Time16.22.17~2007-03-09Time16.23.10.avi
  67. //2068 /mnt/USB1/C:/folderA/axis-test/AXIS207_axis-test_2007-03-12Time11.24.28~2007-03-12Time11.24.50.avi
  68. int
  69. compare(char *s, char *t)
  70. {
  71.         char *ps=NULL, *pt=NULL;
  72.        
  73.         ps = strrchr(s, '_');
  74.         pt = strrchr(t, '_');
  75.         for ( ; *ps == *pt; ps++, pt++)
  76.                 if (*ps == '\0') return 0;
  77.                
  78.         return *ps - *pt;
  79. }

  80. /* qsort_str:  sort v[left]...v[right] into increasing order */
  81. void
  82. qsort_str(char *v[], int left, int right)
  83. {
  84.         static count = 0;
  85.         int i, last;

  86.         if (left >= right)  /* do nothing if array contains */
  87.                 return;         /* fewer than two elements */
  88.         
  89.         swap(v, left, (left + right)/2);
  90.         last = left;
  91.         for (i = left+1; i <= right; i++){
  92.                 if (compare(v[i], v[left]) < 0) swap(v, ++last, i);
  93.         }
  94.         swap(v, left, last);
  95.         qsort_str(v, left, last-1);
  96.         qsort_str(v, last+1, right);
  97. }

  98. static int
  99. sort_file_content(char *unsort_file_name, char *recname)
  100. {
  101.         char *fname[MAXLEN];
  102.         char buffer[MAXLEN] = {0};
  103.         char del_fname[MAXLEN] = {0};
  104.         int idx = 0;
  105.         unsigned long fsize = 0;
  106.         FILE *fp_unsort = NULL, *fp_sort = NULL;

  107.         assert(unsort_file_name && recname);
  108.        
  109.         if( (fp_unsort=fopen(unsort_file_name, "a+")) == NULL ){
  110.                 printf("Error: fail to open the %s\n", unsort_file_name);
  111.                 return -1;
  112.         }
  113.        
  114.         while( !feof(fp_unsort) && idx<file_cnt ) {
  115.                 memset(buffer, 0, MAXLEN);
  116.                 fname[idx] = (char *)malloc(sizeof(char)*MAXLEN);
  117.                 fsize = 0;
  118.                 fgets(fname[idx++], MAXLEN, fp_unsort);
  119.         }
  120.        
  121.         qsort_str(fname, 0, file_cnt-1);
  122.        
  123.         sprintf(del_fname, "/tmp/tmp_delete_%s", recname);
  124.         if( (fp_sort=fopen(del_fname, "w")) == NULL ){
  125.                 printf("Error: fail to open the %s\n", unsort_file_name);
  126.                 return -1;
  127.         }
  128.         for(idx = 0; idx < file_cnt; idx++){
  129.                 fprintf(fp_sort, "%s", fname[idx]);
  130.                 free(fname[idx]);
  131.         }
  132.        
  133.         fcloseall();
  134.         remove(unsort_file_name);
  135.         return 0;
  136. }


  137. int main(int argc, char *argv[])
  138. {
  139.         int loop;
  140.         char unsort_file_name[MAXLEN] = {0};
  141.        
  142.         sprintf(unsort_file_name, "/tmp/tmp_delete_%s_unsort", "axis-test");
  143.        
  144.         /* for 循环之后生成的样本文件见附件    tmp_delete_axis-test_unsort */
  145.         /* 主函数返回后生成的样本文件见附件   tmp_delete_axis-test */
  146.         for(loop = 1; loop < argc; loop++){
  147.                 gen_file_list(argv[loop], "axis-test");
  148.         }
  149.         printf(">:file_cnt is: %d\n", file_cnt);
  150.        
  151.         sort_file_content(unsort_file_name, "axis-test");

  152.         return 0;
  153. }

  154. /*

  155. Call example:
  156. # ./fileContentSort /mnt/USB1/C:/folderA/axis-test /mnt/USB1/C:/folderB/axis-test

  157. */
复制代码

[ 本帖最后由 daworld 于 2007-3-12 22:08 编辑 ]

tmp_delete_axis-test_unsort

5.89 KB, 下载次数: 29

tmp_delete_axis-test_unsort

tmp_delete_axis-test

5.89 KB, 下载次数: 24

mp_delete_axis-test

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP