#include #include #include #include typedef unsigned char byte; struct record { short int year; byte month, day; short int mintemp, avgtemp, maxtemp, maxwind; }; int compare(int y1, int m1, int d1, int y2, int m2, int d2) { if (y1 != y2) return y1 - y2; if (m1 != m2) return m1 - m2; return d1 - d2; } int main() { FILE * fin = fopen("weather.dat", "r"); if (fin == NULL) { fprintf(stderr, "Can't open file\n"); exit(1); } fseek(fin, 0, SEEK_END); int records = ftell(fin) / sizeof(struct record); printf("There are %d records\n", records); while (1) { printf("Enter y m d: "); int y, m, d; scanf("%d %d %d", & y, & m, &d); int first = 0, last = records - 1; while (1) { if (first > last) { printf("not found\n"); break; } int mid = (first + last) / 2; fseek(fin, mid * sizeof(struct record), SEEK_SET); struct record r; fread(& r, sizeof(r), 1, fin); int c = compare(y, m, d, r.year, r.month, r.day); if (c == 0) { printf("%d %d %d %f %f %f %f\n", r.year, r.month, r.day, (double)r.mintemp/10, (double)r.avgtemp/10, (double)r.maxtemp/10, (double)r.maxwind/10); break; } if (c < 0) last = mid - 1; else first = mid + 1; } } fclose(fin); }