Αρχεία (files)

Αρχεία (files)


Ένα αρχείο είναι ένα σύνολο δεδομένων που αποθηκεύονται σε ένα μέσο μόνιμης αποθήκευσης (π.χ. το σκληρό δίσκο, ένα USB stick ή ένα CD) και περιέχουν κάποιες πληροφορίες. Υπάρχουν δύο βασικοί τύποι αρχείων, τα αρχεία κειμένου (text), που περιέχουν πληροφορίες τις οποίες μπορεί να διαβάσει ένας χρήστης ανοίγοντας το αρχείο και τα δυαδικά αρχεία (binary), που περιέχουν πληροφορίες σε δυαδική μορφή.

Ένα πρόγραμμα μπορεί να χρησιμοποιήσει ένα αρχείο είτε για να διαβάσει κάποιες πληροφορίες (δηλαδή ως είσοδο) είτε για να γράψει κάποιες πληροφορίες σε αυτό (δηλαδή ως έξοδο). Προκειμένου σε ένα πρόγραμμα να χειριστούμε αρχεία, χρησιμοποιούμε έναν δείκτη σε έναν ειδικό τύπο δεδομένων που λέγεται FILE.
Προτού χρησιμοποιηθεί ένα αρχείο πρέπει να ανοιχτεί με τη συνάρτηση fopen, ενώ αφού έχουμε τελειώσει με το χειρισμό του αρχείου πρέπει να το κλείσουμε με τη συνάρτηση fclose. Στην fopen καθορίζουμε ποιο θα είναι το αρχείο που θα χρησιμοποιηθεί και πώς θα λέγεται ο δείκτης που θα το αντιπροσωπεύει.
Για να γράψει ένα πρόγραμμα κάποιες πληροφορίες σε ένα αρχείο μπορούμε να χρησιμοποιήσουμε τη συνάρτηση fprintf, ενώ για να διαβάσουμε από ένα αρχείο υπάρχει η συνάρτηση fscanf. Οι συναρτήσεις αυτές είναι αντίστοιχες με τις printf, scanf που χρησιμοποιούνται για να δώσει / πάρει ένα πρόγραμμα πληροφορίες προς / από τον χρήστη, και συντάσσονται με τον ίδιο τρόπο. Η μόνη διαφορά των fprinf, fscanf σε σχέση με τις printf, scanf είναι ότι παίρνουν μία επιπλέον παράμετρο, το δείκτη του αρχείου στο οποίο θα δουλέψουν.
Όλες οι συναρτήσεις χειρισμού των αρχείων ορίζονται μέσα στη βιβλιοθήκη stdio.h.

Στο παρακάτω παράδειγμα ανοίγουμε ένα αρχείο με την ονομασία test.txt, και γράφουμε μέσα σε αυτό μία γραμμή με τη λέξη Hello και μία γραμμή με τον αριθμό 5.

#include "stdio.h"

main () {

  int x = 5;
  FILE * fp;  // Δήλωση του δείκτη που θα αντιπροσωπεύει το αρχείο

  fp = fopen("test.txt", "w");  // Άνοιγμα του αρχείου για γράψιμο
  if (fp != 0) {  // Έλεγχος αν το αρχείο άνοιξε επιτυχώς
    fprintf(fp, "Hello\n");  // Εγγραφή μιας λέξης στο αρχείο
    fprintf(fp, "%d", x);  // Εγγραφή ενός αριθμού στο αρχείο
    fclose(fp);  // Κλείσιμο του αρχείου
  }
  else {
    printf("Den anoikse to arxeio");
  }
}

Όπως φαίνεται παραπάνω, η fopen παίρνει δύο ορίσματα, και επιστρέφει έναν δείκτη τύπου FILE, ο οποίος από το σημείο εκείνο και έπειτα (μέχρι να κλείσει το αρχείο με την fclose) αντιπροσωπεύει το αρχείο. Η πρώτη παράμετρος της fopen είναι το “πραγματικό” όνομα του αρχείου που θέλουμε να ανοίξουμε (δηλαδή η ονομασία που έχει το αρχείο π.χ. στο σκληρό δίσκο). Αν η παράμετρος είναι απλά ένα όνομα, τότε θεωρείται ότι το αρχείο βρίσκεται στον ίδιο φάκελο που τρέχει το πρόγραμμα. Αν θέλουμε να δουλέψουμε με αρχείο σε άλλο φάκελο, πρέπει να βάλουμε στην πρώτη παράμετρο το πλήρες μονοπάτι του αρχείου, π.χ. αν θέλαμε το αρχείο να βρίσκεται στο φάκελο temp ο οποίος βρίσκεται μέσα στο C: (σκληρό δίσκο), θα κάναμε το εξής:

fp = fopen("C:\temp\test.txt", "w");

Παρατηρούμε ότι το “πραγματικό” όνομα του αρχείου δεν χρησιμοποιείται πουθενά αλλού εκτός από την fopen. Όλες οι άλλες συναρτήσεις (fprintf, fclose) χρησιμοποιούν το δείκτη fp για να ξέρουν ποιο είναι το αρχείο με το οποίο θα δουλέψουν.

Η δεύτερη παράμετρος της fopen καθορίζει το πώς θα ανοιχτεί το αρχείο. Οι πιο συνηθισμένες επιλογές είναι:

  • r           : Το αρχείο ανοίγει μόνο για ανάγνωση. Πρέπει ήδη να υπάρχει.
  • r+         : Το αρχείο ανοίγει για ανάγνωση και γράψιμο. Πρέπει ήδη να υπάρχει.
  • w         : Το αρχείο ανοίγει μόνο για γράψιμο. Αν δεν υπάρχει, δημιουργείται.
  • w+       : Το αρχείο ανοίγει για ανάγνωση και γράψιμο. Αν δεν υπάρχει, δημιουργείται.

Πριν προχωρήσουμε παρακάτω από την fopen, πρέπει να ελεγχθεί αν το αρχείο άνοιξε με επιτυχία. Υπάρχουν πολλοί λόγοι για τους οποίους δεν πετυχαίνει η εκτέλεση της fopen (π.χ. χρησιμοποιείται η παράμετρος r για ένα αρχείο που δεν υπάρχει, ή δεν έχουμε δικαιώματα προσπέλασης στο συγκεκριμένο αρχείο). Αν η fopen απέτυχε, τότε ο δείκτης fp θα είναι μηδέν.
Στο παρακάτω παράδειγμα ανοίγουμε το αρχείο με την ονομασία test.txt που δημιουργήθηκε στο προηγούμενο παράδειγμα, και διαβάζουμε από αυτό δύο γραμμές με τη συνάρτηση fscanf. Οι δύο αυτές γραμμές περιέχουν τη λέξη Hello τον αριθμό 5 (μιας και αυτά γράψαμε προηγουμένως) και το πρόγραμμα τα εκτυπώνει στην οθόνη.

#include "stdio.h"

main () {

  int x;
  char leksi[20];
  FILE * fp;  // Δήλωση του δείκτη που θα αντιπροσωπεύει το αρχείο

  fp = fopen("test.txt", "r");  // Άνοιγμα του αρχείου για ανάγνωση
  if (fp != 0) {  // Έλεγχος αν το αρχείο άνοιξε επιτυχώς
    fscanf(fp, "%s", leksi);  // Διάβασμα ενός string από το αρχείο
    fscanf(fp, "%d", &x);  // Διάβασμα ενός αριθμού από το αρχείο
    fclose(fp);  // Κλείσιμο του αρχείου

    // Εκτύπωση στην οθόνη των πληροφοριών που πήραμε από το αρχείο
    printf("%s %d", leksi, x);
  }
  else {
    printf("Den anoikse to arxeio");
  }
}