#include #include #include struct employee { char lastname[30]; char firstname[30]; int emp_id; time_t start_date; }; /* emp_id_compare --- compare by ID */ int emp_id_compare(const void *e1p, const void *e2p) { const struct employee *e1, *e2; e1 = (const struct employee *) e1p; e2 = (const struct employee *) e2p; if (e1->emp_id < e2->emp_id) return -1; if (e1->emp_id > e2->emp_id) return 1; else return 0; } /* print_employee() --- print employee-structure */ void print_employee(const struct employee *emp) { printf("%s %s\t%d\t%s", emp->lastname, emp->firstname, emp->emp_id, ctime(emp->start_date)); } /* main --- demonstarte sorting and bsearching */ int main(int argc, char **argv) { #define NPRES 10 char *myname = argv[0]; struct employee presidents[NPRES]; int i, npres; char buf[BUFSIZ]; struct employee *the_pres; /* pointer-variable for found-item */ struct employee key; /* structure for search-criteria */ int id; /* what we want to search for */ FILE *fp; /* we need a file for president-data, because we use stdin to prompt for the DI */ /* check for arguments */ if (argc != 2) { fprintf(stderr, "usage: %s filename\n", myname); exit(1); } /* Open the file */ if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "%s: %s: could not open: %s", myname, argv[1], strerror(errno)); exit(1); } /* read data from file */ for (npres = 0; (npres < NPRES) && fgets(buf, BUFSIZ, fp) != NULL; npres++) { sscanf(buf, "%s %s %ld %ld", presidents[npres].lastname, presidents[npres].firstname, presidents[npres].emp_id, presidents[npres].start_date); } /* close the file */ fclose(fp); /* npres is now the number of president-items read */ /* Sort presidents by id */ qsort(presidents, npres, sizeof(struct employee), emp_id_compare); /* print sorted array */ printf("Sorted by ID:\n"); for (i = 0; i