Programexempel från Progmet-föreläsning 3, måndag 8 september 2008 ================================================================== baklanges-1.c ------------- // baklanges-1.c #include #include int main(void) { FILE *tsin; FILE *tsut; /* Eller: FILE *tsin. *tsut; */ double talen[17]; int antal; int i = 0; tsin = fopen("reella-tal.txt", "r"); /* Hm... */ fscanf(tsin, "%d", &antal); /* Vi hoppas att det är högst 17... */ while (fscanf(tsin, "%lf", &talen[i]) != EOF) /* Hm... */ i++; fclose(tsin); tsut = fopen("ny-fil.txt", "w"); fprintf(tsut, "%d\n", antal); /* Hm... */ for (i = antal - 1; i >= 0; --i) fprintf(tsut, "%f", talen[i]); /* Hm... */ fclose(tsut); return 0; } baklanges-2.c ------------- // baklanges-2.c #include #include int main(void) { FILE *tsin; FILE *tsut; double* talen; int antal; int i = 0; tsin = fopen("reella-tal.txt", "r"); fscanf(tsin, "%d", &antal); talen = calloc(antal, sizeof(double)); while (fscanf(tsin, "%lf", &talen[i]) != EOF) i++; fclose(tsin); tsut = fopen("ny-fil.txt", "w"); fprintf(tsut, "%d", antal); for (i = antal - 1; i >= 0; --i) fprintf(tsut, "%f\n", talen[i]); fclose(tsut); free(talen); return 0; } baklanges-3.c ------------- // baklanges-3.c #include #include #include #include int main(void) { // Öppna filen med tal, och läs antalet FILE *tsin = fopen("reella-tal.txt", "r"); if (tsin == NULL) { fprintf(stderr, "Det gick inte att öppna in-filen.\n"); fprintf(stderr, "Möjlig felorsak: %s (felkod %d).\n", strerror(errno), errno); exit(EXIT_FAILURE); } int antal; fscanf(tsin, "%d", &antal); // Allokera plats, och läs flyttalen från filen double* talen = malloc(antal * sizeof(double)); if (talen == NULL) { fprintf(stderr, "Det gick inte att skapa plats för %d tal.\n", antal); fprintf(stderr, "Möjlig felorsak: %s (felkod %d).\n", strerror(errno), errno); exit(EXIT_FAILURE); } for (int i = 0; i < antal; ++i) { if (fscanf(tsin, "%lf", &talen[i]) != 1) { fprintf(stderr, "Det gick inte att läsa tal nummer %d från filen.\n", i + 1); exit(EXIT_FAILURE); } } fclose(tsin); // Öppna den nya filen, och skriv flyttalen FILE *tsut = fopen("ny-fil.txt", "w"); if (tsut == NULL) { fprintf(stderr, "Det gick inte att öppna ut-filen.\n"); fprintf(stderr, "Möjlig felorsak: %s (felkod %d).\n", strerror(errno), errno); exit(EXIT_FAILURE); } fprintf(tsut, "%d\n", antal); for (int i = antal - 1; i >= 0; --i) fprintf(tsut, "%f\n", talen[i]); fclose(tsut); free(talen); return 0; } // main namn.c ------ // namn.c #include #include #include int main(void) { char* namn; int langd; printf("Ange längden på namnet (avsluta med 0): "); scanf("%d", &langd); /* Och kolla om scanf gick bra... */ while (getchar() != '\n') ; while (langd > 0) { namn = malloc(langd + 1 + 1); /* \n och \0 */ /* Och kolla om malloc gick bra... */ printf("Ange namnet: "); /* Undvik: gets(namn); */ fgets(namn, langd + 1 + 1, stdin); namn[strlen(namn) - 1] = '\0'; /* Men, om man ska vara noga... */ for (int i = 0; i < langd; ++i) { if (namn[i] == ' ') putchar('\n'); else putchar(namn[i]); } putchar('\n'); free(namn); printf("Ange längden på namnet (avsluta med 0): "); scanf("%d", &langd); while (getchar() != '\n') ; } return 0; }