Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char key[4], Name[21];
int Mark;
}rec;
void merge(rec * rm, rec * r1, rec * r2, int n1, int n2);
void printRecs(rec * r, int n);
void parseF(char * filename, rec * r, int *n);
int main(void)
{
int i, n1=0, n2=0;
rec recs1[10], recs2[10], recs[20];
char s[27];
parseF("bin1", recs1, &n1);
parseF("bin2", recs2, &n2);
merge(recs, recs1, recs2, n1, n2);
printRecs(recs, n1+n2);
return 0;
}
void parseF(char* filename, rec *r, int *n)
{
FILE *f;
char *buffer;
unsigned long fileLen;
int i, ri, part, ci;
f = fopen(filename, "rb");
if ( f == NULL )
{
printf("Cannot open record file %s", filename);
exit(1);
}
fseek(f, 0, SEEK_END);
fileLen = ftell(f);
fseek(f, 0, SEEK_SET);
buffer = (char*)malloc(fileLen+1);
if (!buffer)
{
printf("Cannot allocate memory");
fclose(f);
exit(1);
}
fread(buffer, fileLen, 1, f);
//r = (rec*)malloc(sizeof(rec)*fileLen/27);
i = 0;
ri = 0; // record count
ci = 0;; // character count;
part = 0;
while(i<fileLen)
{
if(buffer[i]=='\0') {continue;}
if (i%27==0)
{
ci=0;
part = 0;
ri++;
}
if (i%27==3)
{
ci=0;
part = 1;
}
if (i%27==23)
{
ci=0;
part = 2;
}
if (part == 0)
{
printf("%c\n", buffer[i]);
r[ri].key[ci++] = buffer[i];
} else if (part == 1)
{
printf("%c\n", buffer[i]);
r[ri].Name[ci++] = buffer[i];
} else if (part == 2)
{
// ??????
}
i++;
}
fclose(f);
}
void merge(rec * rm, rec * r1, rec * r2, int n1, int n2)
{
int i1=0, i2=0, i=0;
while (i1<n1 && i2<n2)
{
if (r1[i1].Mark < r2[i2].Mark)
{
strcpy(rm[i].key, r1[i1].key);
strcpy(rm[i].Name, r1[i1].Name);
rm[i].Mark = r1[i1].Mark;
i1++;
}
else if (r1[i1].Mark > r2[i2].Mark)
{
strcpy(rm[i].key, r2[i2].key);
strcpy(rm[i].Name, r2[i2].Name);
rm[i].Mark = r2[i2].Mark;
i2++;
}
else
{
if (strcmp(r1[i1].Name, r2[i2].Name)<1)
{
strcpy(rm[i].key, r1[i1].key);
strcpy(rm[i].Name, r1[i1].Name);
rm[i].Mark = r1[i1].Mark;
i1++;
}
else
{
strcpy(rm[i].key, r2[i2].key);
strcpy(rm[i].Name, r2[i2].Name);
rm[i].Mark = r2[i2].Mark;
i2++;
}
}
i++;
}
while (i1<n1){ rm[i].Mark = r1[i1].Mark; i1++; i++;}
while (i2<n2){ rm[i].Mark = r2[i2].Mark; i2++; i++;}
}
void printRecs(rec * r, int n)
{
int i;
for (i=0;i<n ;i++ )
{
printf("%3s %20s %4d\n", r[i].key, r[i].Name, r[i].Mark);
}
}
What my code is supposed to do: