#include "stdio.h" #include "string.h" int maxTemp[12*31]; int maxTempYear[12*31]; int minTemp[12*31]; int minTempYear[12*31]; char link[100*12*31]; const char *months[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; bool no_link = false; bool since(int year, int month) { return year > 1981 || (year == 1981 && month >= 8); //return year > 1996 || (year == 1995 && month >= 2); } FILE *fout = 0; void processFile(const char *fn) { FILE *f = fopen(fn, "r"); if (f == 0) { printf("Could not open %s\n", fn); return; } char buffer[1000]; while (fgets(buffer, 999, f)) { if (strncmp(buffer, " 290,", 6) == 0) { int date; int ddvec; int fg; int gem_temp; int min_temp; int max_temp; int dr; int respiration; /* STN,YYYYMMDD,DDVEC,FHVEC, FG, FHX, FHXH, FHN, FHNH, FXX, FXXH, TG, TN, TNH, TX, TXH, T10N,T10NH, SQ, SP, Q, DR, RH, RHX, RHXH, PG, PX, PXH, PN, PNH, VVN, VVNH, VVX, VVXH, NG, UG, UX, UXH, UN, UNH, EV24 */ sscanf(buffer + 6, "%d", &date); sscanf(buffer + 15, "%d", &ddvec); sscanf(buffer + 27, "%d", &fg); sscanf(buffer + 69, "%d", &gem_temp); sscanf(buffer + 75, "%d", &min_temp); sscanf(buffer + 87, "%d", &max_temp); sscanf(buffer + 129, "%d", &dr); sscanf(buffer + 135, "%d", &respiration); int year = date / 10000; int month = (date / 100) % 100; int day = date % 100; int nr = 31 * (month - 1) + day - 1; //if (date > 20230800) // fprintf(stdout, "%s\n%d %d %d %d %d %d\n", buffer, min_temp, max_temp, year, month, day, nr); char c = link[(((year % 100) * 12) + month) * 31 + day]; char ext[2] = { 0, 0 }; if (c != '"') ext[0] = c; if (min_temp < minTemp[nr]) { if (since(year, month) && minTempYear[nr] > 0) { //printf("%d new min temp of %4d from year %d\n", date, min_temp, minTempYear[nr]); if (c != '\0') fprintf(fout, "
  • %s %d, %d: Record minimum temperature of %.1lf°C beating record %.1lf°C from %d\n", year % 100, month, day, ext, months[month-1], day, year, min_temp * 0.1, minTemp[nr] * 0.1, minTempYear[nr]); else fprintf(fout, "
  • %s %d, %d: Record minimum temperature of %.1lf°C beating record %.1lf°C from %d\n", months[month-1], day, year, min_temp * 0.1, minTemp[nr] * 0.1, minTempYear[nr]); } minTemp[nr] = min_temp; minTempYear[nr] = year; } if (max_temp > maxTemp[nr]) { if (since(year, month) && maxTempYear[nr] > 0) { //printf("%d new max temp of %4d from year %d\n", date, max_temp, maxTempYear[nr]); if (c != '\0') fprintf(fout, "
  • %s %d, %d: Record maximum temperature of %.1lf°C beating record %.1lf°C from %d\n", year % 100, month, day, ext, months[month-1], day, year, max_temp * 0.1, maxTemp[nr] * 0.1, maxTempYear[nr]); else fprintf(fout, "
  • %s %d, %d: Record maximum temperature of %.1lf°C beating record %.1lf°C from %d\n", months[month-1], day, year, max_temp * 0.1, maxTemp[nr] * 0.1, maxTempYear[nr]); } maxTemp[nr] = max_temp; maxTempYear[nr] = year; } } } fclose(f); } void parse_file(const char *fn, bool stop_at_H2) { FILE *f = fopen(fn, "r"); char line[300]; while (fgets(line, 299, f)) { const char *s = strstr(line, "

    "); if (stop_at_H2 && s != 0) break; s = strstr(line, "HREF=\"D"); if (s != 0) { s += 7; int year; int month; int day; char ext; if (sscanf(s, "%2d%2d.html#%d%c", &year, &month, &day, &ext) == 4) { if (link[((year * 12) + month) * 31 + day] != '\0') printf("Repeated: %s\n", line); else link[((year * 12) + month) * 31 + day] = ext; char buf[40]; snprintf(buf, 39, "%02d%02d.html#%d%c", year, month, day, ext); if (strncmp(s, buf, strlen(buf)) != 0) printf("ERROR: %s %s\n", buf, s); //printf("%s\n", buf); } } } fclose(f); } int main(int argc, char *argv[]) { for (int i = 0; i < 100*12*31; i++) link[i] = '\0'; parse_file("Dseasons.html", true); parse_file("Snow.html", false); fout = fopen("TempRecords.html", "w"); fprintf(fout, "\n" "Temperature records\n" "\n" "\n" "

    Temperature records

    \n" "\n" "Below the temperature records as recorded at Twente Airport since August 1981\n" "according to the data in the file etmgeg_290.zip from the Royal Netherlands Meteorological Institute. This page is generated by the\n" "program temprecords.cpp.\n" "\n" "\n" "\n" "\n" "


    \n" "
    \n" "Seasons |\n" "Useless lists |\n" "home | email\n" "
    \n" "\n"); return 0; }