External Sorting.
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
void shownums ( char * ) ;
void split ( char * ) ;
void sort ( char * ) ;
void main( )
{
char str[67] ;
clrscr( ) ;
printf ( "Enter file name: " ) ;
scanf ( "%s", str ) ;
printf ( "Numbers before sorting:\n" ) ;
shownums ( str ) ;
split ( str ) ;
sort ( str ) ;
printf ( "\nNumbers after sorting:\n" ) ;
shownums ( str ) ;
getch( ) ;
}
/* Displays the contents of file */
void shownums ( char *p )
{
FILE *fp ;
int i ;
fp = fopen ( p, "rb" ) ;
if ( fp == NULL )
{
printf ( "Unable to open file." ) ;
getch( ) ;
exit ( 0 ) ;
}
while ( fread ( &i, sizeof ( int ), 1, fp ) != 0 )
printf ( "%d \t", i ) ;
fclose ( fp ) ;
}
/* Splits the original file into two files */
void split ( char *p )
{
FILE *fs, *ft ;
long int l, count ;
int i ;
fs = fopen ( p, "rb" ) ;
if ( fs == NULL )
{
printf ( "Unable to open file." ) ;
getch( ) ;
exit ( 0 ) ;
}
ft = fopen ( "temp1.dat", "wb" ) ;
if ( ft == NULL )
{
fclose ( fs ) ;
printf ( "Unable to open file." ) ;
getch( ) ;
exit ( 1 ) ;
}
fseek ( fs, 0L, SEEK_END ) ;
l = ftell ( fs ) ;
fseek ( fs, 0L, SEEK_SET ) ;
l = l / ( sizeof ( int ) * 2 ) ;
for ( count = 1 ; count <= l ; count++ )
{
fread ( &i, sizeof ( int ), 1, fs ) ;
fwrite ( &i, sizeof ( int ), 1, ft ) ;
}
fclose ( ft ) ;
ft = fopen ( "temp2.dat", "wb" ) ;
if ( ft == NULL )
{
fclose ( fs ) ;
printf ( "Unable to open file." ) ;
getch( ) ;
exit ( 2 ) ;
}
while ( fread ( &i, sizeof ( int ), 1, fs ) != 0 )
fwrite ( &i, sizeof ( int ), 1, ft ) ;
fcloseall ( ) ;
}
/* Sorts the file */
void sort ( char *p )
{
FILE *fp[4] ;
char *fnames[ ] =
{
"temp1.dat",
"temp2.dat",
"final1.dat",
"final2.dat"
} ;
int i, j = 1, i1, i2, flag1, flag2, p1, p2 ;
long int l ;
while ( 1 )
{
for ( i = 0 ; i <= 1 ; i++ )
{
fp[i] = fopen ( fnames[i], "rb+" ) ;
if ( fp[i] == NULL )
{
fcloseall( ) ;
printf ( "Unable to open file." ) ;
getch( ) ;
exit ( i ) ;
}
fseek ( fp[i], 0L, SEEK_END ) ;
l = ftell ( fp[i] ) ;
if ( l == 0 )
goto out ;
fseek ( fp[i], 0L, SEEK_SET ) ;
}
for ( i = 2 ; i <= 3 ; i++ )
{
fp[i] = fopen ( fnames[i], "wb" ) ;
if ( fp[i] == NULL )
{
fcloseall( ) ;
printf ( "Unable to open file." ) ;
getch( ) ;
exit ( i ) ;
}
}
i = 2 ;
i1 = i2 = 0 ;
flag1 = flag2 = 1 ;
while ( 1 )
{
if ( flag1 )
{
if ( fread ( &p1, sizeof ( int ), 1, fp[0] ) == 0 )
{
/* If first file ends then the whole content of second
file is written in the respective target file */
while ( fread ( &p2, sizeof ( int ), 1, fp[1] ) != 0 )
fwrite ( &p2, sizeof ( int ), 1, fp[i] ) ;
break ;
}
}
if ( flag2 )
{
if ( fread ( &p2, sizeof ( int ), 1, fp[1] ) == 0 )
{
/* If second file ends then the whole content of first
file is written in the respective target file */
fwrite ( &p1, sizeof ( int ), 1, fp[i] ) ;
while ( fread ( &p1, sizeof ( int ), 1, fp[0] ) != 0 )
fwrite ( &p1, sizeof ( int ), 1, fp[i] ) ;
break ;
}
}
if ( p1 < p2 )
{
flag2 = 0 ;
flag1 = 1 ;
fwrite ( &p1, sizeof ( int ), 1, fp[i] ) ;
i1++ ;
}
else
{
flag1 = 0 ;
flag2 = 1 ;
fwrite ( &p2, sizeof ( int ), 1, fp[i] ) ;
i2++ ;
}
if ( i1 == j )
{
flag1 = flag2 = 1 ;
fwrite ( &p2, sizeof ( int ), 1, fp[i] ) ;
for ( i2++ ; i2 < j ; i2++ )
{
if ( fread ( &p2, sizeof ( int ), 1, fp[1] ) != 0 )
fwrite ( &p2, sizeof ( int ), 1, fp[i] ) ;
}
i1 = i2 = 0 ;
i == 2 ? ( i = 3 ) : ( i = 2 ) ;
}
if ( i2 == j )
{
flag1 = flag2 = 1 ;
fwrite ( &p1, sizeof ( int ), 1, fp[i] ) ;
for ( i1++ ; i1 < j ; i1++ )
{
if ( fread ( &p1, sizeof ( int ), 1, fp[0] ) != 0 )
fwrite ( &p1, sizeof ( int ), 1, fp[i] ) ;
}
i1 = i2 = 0 ;
i == 2 ? ( i = 3 ) : ( i = 2 ) ;
}
}
fcloseall( ) ;
remove ( fnames[0] ) ;
remove ( fnames[1] ) ;
rename ( fnames[2], fnames[0] ) ;
rename ( fnames[3], fnames[1] ) ;
j *= 2 ;
}
out :
fcloseall( ) ;
remove ( p ) ;
rename ( fnames[0], p ) ;
remove ( fnames[1] ) ;
}