// Lösningsförslag till datorövning 6, Programmering C. (Senaste ändring av denna fil: 17 juni 2013) /* uppg6a.c */ #include int main() { FILE *fil; double tal; fil = fopen("rtal.txt", "w"); /* Eller "wt", men text är default. */ printf("Skriv tal (0 avslutar): "); scanf("%lf", &tal); while ( tal != 0.0 ) { fprintf(fil, "%.2f\n", tal); printf("Skriv tal (0 avslutar): "); scanf("%lf", &tal); } fclose(fil); puts("Studera filen rtal.txt i en texteditor..."); return 0; } /* uppg6b.c */ #include #include int main() { FILE *fil; int antal; double summa, tal; fil = fopen("rtal.txt", "rt"); /* Eller "r", för text är default. */ if ( fil == NULL ) { /* Presentera fel, avsluta main */ puts("Filen rtal.txt finns inte."); return EXIT_FAILURE; /*********/ } antal = 0; summa = 0.0; /* Så länge tal kunde läsas in ... */ while ( fscanf(fil, "%lf", &tal) == 1 ) { antal++; summa = summa + tal; } fclose(fil); printf("Medelvärde av talen i rtal.txt: %.2f\n", summa / antal); return 0; /* Eller EXIT_SUCCESS */ } /* uppg6c.c */ #include #include int main() { FILE *fil; char filnamn[80 + 1]; int antal, tecken; /* Läs filnamn från tangentbordet */ printf("Ange filnamn: "); gets(filnamn); /* På riktigt ska man inte använda gets! */ fil = fopen(filnamn, "rt"); if ( fil == NULL ) { printf("%s finns inte.\n", filnamn); return EXIT_FAILURE; /*********/ } /* Läs igenom filen tecken för tecken */ antal = 0; while ( ( tecken = fgetc(fil) ) != EOF ) if ( tecken == ';' ) antal++; fclose(fil); printf("Antal ; i %s = %d\n", filnamn, antal); return EXIT_SUCCESS; } /* uppg6d.c */ #include #include int main() { FILE *fil; char filnamn[80 + 1], namnbuf[80 + 1 + 1]; /* +1 för '\n' och +1 för '\0' */ int antal; /* Läs filnamn från tangentbordet */ printf("Ange filnamn: "); gets(filnamn); /* På riktigt ska man inte använda gets! */ fil = fopen(filnamn, "rt"); if ( fil == NULL ) { printf("%s finns inte.\n", filnamn); return EXIT_FAILURE; /*********/ } antal = 0; /* Så länge det går bra att läsa en rad ... */ while ( fgets(namnbuf, 80 + 1 + 1, fil) != NULL ) { /* Eller hellre: sizeof namnbuf */ antal++; /* Inget \n i printf ty fgets lägger '\n' * sist i strängen som man får tillbaka. Till * skillnad från gets som INTE tar med '\n' i * den sträng som den ger tillbaka. */ printf("%2d %s", antal, namnbuf); } fclose(fil); return EXIT_SUCCESS; } /* uppg6e.c */ #include #include #include int main() { FILE *fil; int index, tal; puts("Genererar en fil tarning.dat ..."); srand((unsigned)time(NULL)); fil = fopen("tarning.dat", "wb"); for (index = 0; index < 500; index++) { tal = 1 + rand() % 6; /* Skriv till filen */ fwrite( &tal, sizeof(tal), 1, fil); } fclose(fil); return EXIT_SUCCESS; } /* uppg6f.c */ #include #include int main() { FILE *fil; int index, antal, tal, summa; fil = fopen("tarning.dat", "rb"); if ( fil == NULL ) { puts("tarning.dat finns inte"); return EXIT_FAILURE; /********/ } puts("Läser filen tarning.dat..."); antal = 0; summa = 0.0; for (index = 0; index < 500; index++) { fread(&tal, sizeof(tal), 1, fil); printf("%d\n", tal); antal++; summa = summa + tal; } fclose(fil); printf("Medelvärdet av talen blev: %.3f\n", (double)summa/(double)antal); return EXIT_SUCCESS; } /* uppg6g.c */ #include #include #include struct matpost { int nr; double temp; } post; int main() { FILE *fil; int index; srand((unsigned)time(NULL));; fil = fopen("temp.dat", "wb"); for (index = 100; index < 200; index++) { post.nr = index; post.temp = 20.0 + rand() % 101 / 10.0; fwrite(&post, sizeof(post), 1, fil); } fclose(fil); puts("Temperaturposterna finns nu i temp.dat"); return EXIT_SUCCESS; } /* uppg6h.c */ #include #include struct matpost { int nr; double temp; } post, minpost, maxpost; int main() { FILE *fil; int index; fil = fopen("temp.dat", "rb"); if ( fil == NULL ) { puts("temp.dat finns inte!"); return EXIT_FAILURE; /********/ } /* Se till att minpost och maxpost båda sätts till första inlästa */ minpost.temp = 100.0; maxpost.temp = 0.0; for (index = 100; index < 200; index++) { fread(&post, sizeof(post), 1, fil); if ( post.temp < minpost.temp ) { minpost = post; } if ( post.temp > maxpost.temp ) { maxpost = post; } } fclose(fil); printf("Lägsta post: (%d, %.2f)\n", minpost.nr, minpost.temp); printf("Högsta post: (%d, %.2f)\n", maxpost.nr, maxpost.temp); return EXIT_SUCCESS; } /* uppg6i.c */ #include #include #include /* strlen */ /* fgets lägger med '\n' sist i strängen. Den här funktionen tar bort det. */ void ta_bort_radslut(char buf[]) { int sista = strlen(buf) - 1; buf[sista] = '\0'; /* Vi borde ha felkontroll. Om strängen inte fick plats, eller filen tog slut, kanske inget radslut finns! */ } struct bil_s { char regnr[10 + 1]; char namn[40 + 1]; char marke[20 + 1]; } post; int main() { FILE *infil, *utfil; infil = fopen("bil.txt", "rt"); if ( infil == NULL ) { puts("bil.txt finns inte!"); return EXIT_FAILURE; /********/ } utfil = fopen("bil.dat", "wb"); while ( fgets(post.regnr, sizeof post.regnr, infil) != NULL ) { fgets(post.namn, sizeof post.namn, infil); fgets(post.marke, sizeof post.marke, infil); ta_bort_radslut(post.regnr); ta_bort_radslut(post.namn); ta_bort_radslut(post.marke); fwrite(&post, sizeof(post), 1, utfil); } fclose(infil); fclose(utfil); puts("bil.dat genererad"); return EXIT_SUCCESS; } /* uppg6j.c */ #include #include #include struct bil_s { char regnr[10 + 1]; char namn[40 + 1]; char marke[20 + 1]; } post; int main() { FILE *fil; char regnr[10]; int hittad; /* Öppna fil för läsning/skrivning */ fil = fopen("bil.dat", "rb+"); if ( fil == NULL ) { puts("bil.dat finns inte!"); return EXIT_FAILURE; /********/ } /* Läs regnr från tangentbordet */ printf("Ge ett regnummer: "); gets(regnr); /* På riktigt ska man inte använda gets! */ hittad = 0; while ( !hittad && fread(&post, sizeof(post), 1, fil) == 1 ) { hittad = ( strcmp(post.regnr, regnr) == 0 ); } if ( hittad ) { puts("Så här ser posten ut: "); printf("REGNR: %s\nÄGARE: %s\nMÄRKE: %s\n\n", post.regnr, post.namn, post.marke); printf("Nytt namn: "); gets(post.namn); /* På riktigt ska man inte använda gets! */ /* Gå tillbaka en post i filen, skriv över med nya data */ fseek(fil, -1L*sizeof(post), SEEK_CUR); fwrite(&post, sizeof(post), 1, fil); puts("bil.dat uppdaterad"); } else { puts("Hittade inte posten i bil.dat"); } fclose(fil); return EXIT_SUCCESS; }