文件合并排序

/*********************************************************************************************************
文件名称 : merge.c
建立时间 : 2005-10-19
版权所有 : 东软股份大连分公司电信事业开发部
Author   : 中介部.吴喆喆
文件描述 :
  文件合并排序
 
修改记录 :
========================================================================================================
序号 修改日期    修改人 修改原因

*********************************************************************************************************/


#include <stdio.h>
#include <stdlib.h>

main()
{
 int i1, i2, t1=1, t2=1;
 int i3; /*排除相同数字时要用到*/
 FILE *f1, *f2, *out;
 f1 = fopen("file1", "r");
 f2 = fopen("file2", "r");
 out = fopen("out", "w");
 
 fscanf(f1, "%d", &i1);
 fscanf(f2, "%d", &i2);
 
#if 0 /*这是最原始的, 原作者的想法, 但是没有把重复的数字排除*/
 while (t1 && t2)
 {
  if (i1 > i2)
  {
   fprintf(out, " %d", i2);
   fscanf(f2, "%d", &i2);
   if (feof(f2))
    t2 = 0;  /*代表文件file2到结尾了, 不用再从file2中取数了*/
  }
  else
  {
   fprintf(out, " %d", i1);
   fscanf(f1, "%d", &i1);
   if (feof(f1))
    t1 = 0;
  }
 }
 
 /*把某个没有读完的文件中的其余数字写进out*/
 while (t1)
 {
  fprintf(out, " %d", i1);
  fscanf(f1, "%d", &i1);
  if (feof(f1))
   t1 = 0;
 }
 while (t2)
 {
  fprintf(out, " %d", i2);
  fscanf(f2, "%d", &i2);
  if (feof(f2))
   t2 = 0;
 }
#endif

 /*在原始的基础上, 俺增加了对相同数字的排除, 我认为比wjvlangz(清菜虫虫)写的好*/
 while (t1 && t2)
 {
  if (i1 > i2)
  {
   i3 = i2;  /*保存i2到i3, 因为i2要被赋其它的值, 但还要用到原来的i2,所以...*/
   fprintf(out, " %d", i2);
   fscanf(f2, "%d", &i2); /*再读一个i2*/
   
   /*这里我认为要先!feof(f2), 因为上面是fscanf(f2, "%d", &i2), 要先判断一下, 然后再(i3 == i2), 如果到了文件尾, 因为"短路",
   后面的(i3 == i2)就不会进行, 否则先判断有可能因为到了文件尾而出异常现象*/
   while (!feof(f2) && (i3 == i2)) /*如果读出来的一直与前面的一样, 就一直读, 直到不一样并且file2没到结尾*/
    fscanf(f2, "%d", &i2);
   
   if (feof(f2))
    t2 = 0;  /*代表文件file2到结尾了, 不用再从file2中取数了*/
  }
  else if(i1 < i2)
  {
   i3 = i1;  /*保存i1*/
   fprintf(out, " %d", i1);
   fscanf(f1, "%d", &i1);
   while (!feof(f1) && (i3 == i1)) /*如果读出来的一直与前面的一样, 就一直读, 直到不一样并且file2没到结尾*/
    fscanf(f1, "%d", &i1);
   
   if (feof(f1))
    t1 = 0;
  }
  else    /*i1等于i2的情况*/
  {
   i3 = i1;  /*保存i1*/
   fprintf(out, " %d", i1);
   fscanf(f1, "%d", &i1);
   fscanf(f2, "%d", &i2);
   while (!feof(f1) && (i3 == i1))  /*直到读取file1到从file1取出的数与i3不同并且file1没到结尾*/
    fscanf(f1, "%d", &i1);
   while (!feof(f2) && (i3 == i2))  /*直到读取file2到从file2取出的数与i3不同并且file2没到结尾*/
    fscanf(f2, "%d", &i2);
    
   if (feof(f1))
    t1 = 0;
   if (feof(f2))
    t2 = 0;
  }
 }
 
 /*把某个没有读完的文件中的其余数字写进out*/
 while (t1)
 {
  fprintf(out, " %d", i1);
  fscanf(f1, "%d", &i1);
  if (feof(f1))
   t1 = 0;
 }
 while (t2)
 {
  fprintf(out, " %d", i2);
  fscanf(f2, "%d", &i2);
  if (feof(f2))
   t2 = 0;
 }

 

#if 0 /*这是我的想法, 也借鉴了上面的大部分*/
 while (1)
 {
  if (i1 > i2)
  {
   fprintf(out, " %d", i2);
   fscanf(f2, "%d", &i2);
   if (feof(f2))
    break;  
  }
  else
  {
   fprintf(out, " %d", i1);
   fscanf(f1, "%d", &i1);
   if (feof(f1))
    break;
  }
 }
 
 while (1)
 {
  if (feof(f1))
   break;
  else{
  fprintf(out, " %d", i1);
  fscanf(f1, "%d", &i1);
  }
 }
 while (1)
 {
  if (feof(f2))
   break;
  else{
  fprintf(out, " %d", i2);
  fscanf(f2, "%d", &i2);
  }
 }
#endif
 
 
 fclose(f1);
 fclose(f2);
 fclose(out);
 
 printf("OK!/n");
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值