/*********************************************************************************************************
文件名称 : 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");
}