Programexempel från Progmet-föreläsning 4, onsdag 10 september 2008 =================================================================== Här är programmet med en fast array, som det blev till sist i måndags: baklanges-1b.c ------------- // baklanges-1b.c #include #include int main(void) { FILE *tsin; FILE *tsut; double talen[17]; int antal; int i; tsin = fopen("reella-tal.txt", "r"); fscanf(tsin, "%d", &antal); for (i = 0; i < antal; ++i) fscanf(tsin, "%lf", &talen[i]); fclose(tsin); tsut = fopen("ny-fil.txt", "w"); fprintf(tsut, "%d\n", antal); for (i = antal - 1; i >= 0; --i) fprintf(tsut, "%f\n", talen[i]); fclose(tsut); return 0; } Här är samma program, men ändrat till att använda en malloc-allokerad array: baklanges-2b.c ------------- // baklanges-2b.c #include #include int main(void) { FILE *tsin; FILE *tsut; double *talen; int antal; int i; tsin = fopen("reella-tal.txt", "r"); fscanf(tsin, "%d", &antal); talen = malloc(antal * sizeof(double)); for (i = 0; i < antal; ++i) fscanf(tsin, "%lf", &talen[i]); fclose(tsin); tsut = fopen("ny-fil.txt", "w"); fprintf(tsut, "%d\n", antal); for (i = antal - 1; i >= 0; --i) fprintf(tsut, "%f\n", talen[i]); fclose(tsut); free(talen); return 0; } Här är samma program, lite mer fullständigt: 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; } baklanges-4.c ------------- // baklanges-4.c #include #include struct talpost { double talet; struct talpost* next; }; int main(void) { FILE *tsin; FILE *tsut; struct talpost* first = NULL; struct talpost* this; int antal; int i; tsin = fopen("reella-tal.txt", "r"); fscanf(tsin, "%d", &antal); for (i = 0; i < antal; ++i) { struct talpost* new; new = malloc(sizeof(struct talpost)); fscanf(tsin, "%lf", &new->talet); new->next = first; first = new; } fclose(tsin); tsut = fopen("ny-fil.txt", "w"); fprintf(tsut, "%d\n", antal); this = first; while (this != NULL) { fprintf(tsut, "%f\n", this->talet); this = this->next; } fclose(tsut); /* Hm... */ this = first; while (this != NULL) { free(this); this = this->next; } return 0; }