89 lines
2.0 KiB
C
89 lines
2.0 KiB
C
/* stringmerge.c -- Given two sorted files of strings, it creates
|
|
* a sorted file consisting of all their elements.
|
|
* The names of the files are passed as command
|
|
* line parameters.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#define MAXBUFFER 128
|
|
|
|
int getline(FILE * fd, char buff[], int nmax){
|
|
/* It reads a line from fd and stores up to nmax of
|
|
* its characters to buff.
|
|
*/
|
|
char c;
|
|
int n=0;
|
|
|
|
while ((c=getc(fd))!='\n'){
|
|
if(c==EOF)return EOF;
|
|
if(n<nmax)
|
|
buff[n++]=c;
|
|
}
|
|
buff[n]='\0';
|
|
return n;
|
|
}
|
|
|
|
int stringMerge(char filename1[], char filename2[] , char filename3[]) {
|
|
/* Given two sorted files of strings, called filename1 and filename2,
|
|
* it writes their merged sequence to the file filename3.
|
|
* It returns the total number of strings written to filename3.
|
|
*/
|
|
FILE *fd1, *fd2, *fd3;
|
|
char buffer1[MAXBUFFER], buffer2[MAXBUFFER];
|
|
int ln1, ln2;
|
|
int n=0;
|
|
|
|
if ((fd1=fopen(filename1, "r"))==NULL) {
|
|
perror("fopen");
|
|
exit(1);
|
|
}
|
|
if ((fd2=fopen(filename2, "r"))==NULL) {
|
|
perror("fopen");
|
|
exit(1);
|
|
}
|
|
if ((fd3=fopen(filename3, "w"))==NULL) {
|
|
perror("fopen");
|
|
exit(1);
|
|
}
|
|
|
|
ln1 = getline(fd1,buffer1,MAXBUFFER-1);
|
|
ln2 = getline(fd2,buffer2,MAXBUFFER-1);
|
|
|
|
while ((ln1!=EOF) && (ln2!=EOF)){
|
|
if (strcmp(buffer1,buffer2)<=0){
|
|
fprintf(fd3, "%s\n", buffer1);
|
|
ln1 = getline(fd1,buffer1,MAXBUFFER-1);
|
|
}else{
|
|
fprintf(fd3, "%s\n", buffer2);
|
|
ln2 = getline(fd2,buffer2,MAXBUFFER-1);
|
|
}
|
|
n++;
|
|
}
|
|
|
|
while (ln1!=EOF){
|
|
fprintf(fd3, "%s\n", buffer1);
|
|
ln1=getline(fd1,buffer1,MAXBUFFER-1);
|
|
n++;
|
|
}
|
|
|
|
while (ln2!=EOF){
|
|
fprintf(fd3, "%s\n", buffer2);
|
|
ln2=getline(fd2,buffer2,MAXBUFFER-1);
|
|
n++;
|
|
}
|
|
|
|
fclose(fd1);
|
|
fclose(fd2);
|
|
fclose(fd3);
|
|
return n;
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if(argc!=4){
|
|
printf("Usage: %s sortedfile1 sortedfile2 mergefile\n", argv[0]);
|
|
exit(0);
|
|
}
|
|
printf("We have %d merged records\n",
|
|
stringMerge(argv[1], argv[2], argv[3]));
|
|
}
|