| Συνάρτηση | Χρήση |
|---|---|
fopen(filename, mode) | Ανοίγει αρχείο — επιστρέφει FILE* ή NULL |
fclose(fp) | Κλείνει το αρχείο (ΠΑΝΤΑ στο τέλος) |
fprintf(fp, ...) | Γράφει formatted text (όπως printf) |
fscanf(fp, ...) | Διαβάζει formatted text (όπως scanf) |
fgetc(fp) | Διαβάζει έναν χαρακτήρα |
fputc(ch, fp) | Γράφει έναν χαρακτήρα |
fgets(buf, size, fp) | Διαβάζει μία γραμμή |
EOF | Ειδική τιμή για "τέλος αρχείου" |
Modes: "r" read · "w" write (σβήνει το υπάρχον!) · "a" append · "r+" read+write
Γράψτε πρόγραμμα σε C το οποίο:
askisi1.txt.fopen("askisi1.txt", "w"). Το "w" σβήνει υπάρχον αρχείο.fopen. if (fp == NULL) return 1;if (num >= 10 && num <= 20) — διπλός έλεγχος με &&.fprintf(fp, "%d\n", num); — το \n είναι απαραίτητο για νέα γραμμή.fclose(fp); πάντα στο τέλος — αλλιώς μπορεί να μην γραφτούν τα δεδομένα (buffering).do-while χωρίς priming → το -1 γράφεται στο αρχείο.\n → όλοι οι αριθμοί σε μία γραμμή.system("notepad ...") μόνο σε Windows — σε Linux/Mac χρήση xdg-open ή cat.Γράψτε πρόγραμμα σε C το οποίο:
numbers.txt.fopen("numbers.txt", "r"). Αν το αρχείο δεν υπάρχει, επιστρέφει NULL.float sum = 0; — ΠΑΝΤΑ, αλλιώς garbage value.while (fscanf(file, "%f", &number) == 1). Η fscanf επιστρέφει πλήθος επιτυχημένων αναγνώσεων — 1 όταν διαβάσει επιτυχώς έναν αριθμό.%f ή %d.printf("Άθροισμα: %.2f\n", sum); — %.2f για 2 δεκαδικά.sum = 0.!= EOF αντί == 1 — μπορεί να κάνει infinite loop αν διαβάσει σκουπίδια.%d για ακεραίους, %f για float, %lf για double.Γράψτε πρόγραμμα σε C το οποίο:
text.txt).a, e, i, o, u).fgetc(file) επιστρέφει τον επόμενο χαρακτήρα ή EOF στο τέλος.ch πρέπει να είναι int, ΟΧΙ char! Το EOF είναι -1 και με unsigned char δεν μπορεί να αναπαρασταθεί σωστά.while ((ch = fgetc(file)) != EOF) — προσοχή στις παρενθέσεις γύρω από την ανάθεση.||: if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')'A', 'E', ... ή χρησιμοποίησε tolower(ch) από το <ctype.h>.int count = 0;char ch αντί int ch → bug που εμφανίζεται σε συγκεκριμένα platforms.while (ch = fgetc(file) != EOF) — λάθος λόγω προτεραιότητας (η != έχει προτεραιότητα πάνω από την =).fgets)Γράψτε πρόγραμμα σε C το οποίο:
students.txt.fgets αντί scanf;scanf("%s", name) σταματά στο πρώτο κενό. Αν δώσεις "Γιώργος Παπαδόπουλος", αποθηκεύει μόνο "Γιώργος".fgets(name, 100, stdin) διαβάζει ολόκληρη τη γραμμή μέχρι το \n (και συμπεριλαμβάνει το \n).char name[100]; για να χωράνε και τα μεγάλα ονόματα.fgets(buffer, μέγιστο μέγεθος, stdin) — το stdin είναι η standard input (πληκτρολόγιο).\n: fprintf(file, "%s", name); — ΟΧΙ "%s\n" γιατί η fgets έχει ήδη συμπεριλάβει το \n στο string.fprintf(file, "%s\n", name) ενώ το name έχει ήδη \n → κενές γραμμές στο αρχείο.scanf("%d", ...), αφήνει το \n στο buffer και η fgets διαβάζει κενό string! Λύση: getchar() ή scanf(" %[^\n]", ...).\n: name[strcspn(name, "\n")] = '\0'; (χρειάζεται <string.h>).char name[10] είναι επικίνδυνο για μεγάλα ονόματα.scanf)Γράψτε πρόγραμμα σε C το οποίο:
students.txt.char name[50]; — αρκετά μεγάλο buffer για το μεγαλύτερο πιθανό όνομα.scanf("%s", name) — ΟΧΙ &name! Ο πίνακας είναι ήδη διεύθυνση.%s διαβάζει μέχρι το πρώτο κενό. Για πλήρη γραμμή (π.χ. "Γιώργος Παπαδόπουλος") χρησιμοποίησε fgets(name, 50, stdin).fprintf(file, "%s\n", name); — το \n βάζει κάθε όνομα σε δική του γραμμή.for (int i = 0; i < 5; i++) { ... } — απλό counter loop για τις 5 εισαγωγές.scanf("%s", &name) — λάθος, το name είναι ήδη pointer.scanf("%s", name) χωρίς όριο. Ασφαλές: scanf("%49s", name)."a" (append) αντί "w" → συσσώρευση ονομάτων σε κάθε εκτέλεση.\n → όλα τα ονόματα κολλημένα.Γράψτε πρόγραμμα σε C το οποίο:
input.txt).output.txt).fgetc() και fputc().FILE *source, *destination;fopen. Αν αποτύχει το δεύτερο, πρέπει να κλείσεις το πρώτο πριν κάνεις return (resource cleanup).fprintf).fclose(source); fclose(destination);int ch — το EOF απαιτεί int.fputc(destination, ch) — αντίστροφη σειρά ορισμάτων.char ch αντί int ch."rb" και "wb".fopen.count = 0, sum = 0).int για τον χαρακτήρα όταν διαβάζεις με fgetc."w" σβήνει! Χρησιμοποίησε "a" αν θες append.fscanf(...) == 1 για ακριβή έλεγχο επιτυχίας ανάγνωσης.\n στο fprintf όταν θες νέες γραμμές.