Εγγραφή και ανάγνωση προσαρμοσμένων τύπων δεδομένων σε δυαδικά αρχεία. Δυαδικό αρχείο

Παιδικά είδη 07.07.2019

Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...

Όλες οι πληροφορίες αποθηκεύονται στον υπολογιστή με τη μορφή 0 και 1, δηλαδή σε δυαδική μορφή. Τα δυαδικά αρχεία διαφέρουν από τα αρχεία κειμένου μόνο ως προς τις μεθόδους εργασίας με αυτά. Για παράδειγμα, εάν γράψουμε τον αριθμό "4" σε ένα αρχείο κειμένου, τότε γράφεται ως χαρακτήρας και χρειάζεται ένα byte για την αποθήκευσή του. Κατά συνέπεια, το μέγεθος του αρχείου θα είναι ίσο με ένα byte. Ένα αρχείο κειμένου που περιέχει την καταχώρηση: "145687" θα έχει μέγεθος έξι byte.

Αν γράψουμε τον ακέραιο αριθμό 145.687 σε ένα δυαδικό αρχείο, θα έχει μέγεθος τεσσάρων byte, αφού αυτό είναι το ποσό που χρειάζεται για την αποθήκευση δεδομένων int. Δηλαδή, τα δυαδικά αρχεία είναι πιο συμπαγή και σε ορισμένες περιπτώσεις ευκολότερα στην επεξεργασία.

Εγγραφή τυπικών τύπων δεδομένων σε δυαδικά αρχεία

Για να ανοίξετε ένα δυαδικό αρχείο, πρέπει να ορίσετε τη λειτουργία πρόσβασης σε ios::binary (σε ορισμένους μεταγλωττιστές C++, ios::bin).

Για να δημιουργήσετε ένα αρχείο εξόδου, δημιουργήστε ένα αντικείμενο:

ofstream outBinFile("out.bin", ios::out | ios::binary);

/* δημιουργώντας ένα αντικείμενο κλάσηςτου ρεύματος έξω. αποθήκη

αν (! out_f i 1) //τυπικός έλεγχος

Τα δεδομένα γράφονται χρησιμοποιώντας τη μέθοδο write(), η οποία έχει δύο παραμέτρους: η πρώτη είναι ένας δείκτης στην αρχή (διεύθυνση έναρξης) των δεδομένων που γράφονται, η δεύτερη είναι ο αριθμός των byte που θα γραφτούν. Σε αυτήν την περίπτωση, ο δείκτης πρέπει να μετατραπεί ρητά στον τύπο char.

Παράδειγμα 1.Γράψτε μεταβλητές διαφόρων τύπων σε ένα δυαδικό αρχείο:

ofstream outBinFile("test.bin", ios::out I

ios: :binary) ; /^δημιουργώντας ένα αντικείμενο κλάσηςτου ρέματος και προσπαθεί να το συνδέσει με ένα αρχείοδοκιμή. αποθήκη σε λειτουργία εγγραφής δυαδικού αρχείου */

int a - 145687; //δήλωση ολόκληρης μεταβλητήςΕΝΑ

outBinFi le. write ((char*) &a, sizeof (a)) ; /^εγγραφή στο αρχείο

μεταβλητόςΕΝΑ ως ροή byte, δηλαδή εγγραφή σε ένα αρχείο της εσωτερικής αναπαράστασης ολόκληρης της μεταβλητής a */ float x - 123,25; // δήλωση μιας πραγματικής μεταβλητήςΧ

outBinFile .write ((char*) &x, sizeof (x)) ; /^εγγραφή στο αρχείο

μεταβλητόςΧ ως ροή byte, δηλαδή εγγραφή σε ένα αρχείο της εσωτερικής αναπαράστασης ολόκληρης της μεταβλητής x*/

//ορισμός συμβολικής μεταβλητήςΜε και αρχικοποιώντας το με το σύμβολο g outBinFile.write((char*)&c, sizeof(c));

//εγγραφή ενός συμβόλουσολ να αρχειοθετήσω

outBinFile.close(); επιστροφή 0;

Εάν ανοίξετε τα περιεχόμενα του αρχείου test .bin με ένα πρόγραμμα επεξεργασίας κειμένου, θα μοιάζει με:

και το μέγεθος του αρχείου θα είναι 9 byte.

Ανάγνωση τυπικών τύπων δεδομένων από δυαδικά αρχεία

Για να ανοίξετε ένα υπάρχον δυαδικό αρχείο για ανάγνωση, πρέπει να δημιουργήσετε ένα αντικείμενο:

ifstream inpBinFile("inp.bin", ios::in I ios::binary);

/* χρησιμοποιούμε έναν διαχωρισμό σημαιών που υποδεικνύει ότι το αρχείο είναι ανοιχτό για ανάγνωση σε δυαδική μορφή */

εάν (! inpBinFile)

coutΓια να διαβάσουμε δεδομένα, χρησιμοποιούμε τη συνάρτηση read(), η οποία έχει παραμέτρους παρόμοιες με τη συνάρτηση write().

#include using namespace std; int main()

ifstream inpBinFile("test.bin", ios::in I

ios::binary); / /άνοιξε το αρχείο για ανάγνωση σε δυαδική μορφή

int a? float x; char c = "g";

inpBinFile.read((char*)&a, sizeof(a));

//διαβάστε μια ακέραια μεταβλητή inpBinFile.read((char*)&x, sizeof(x));

//διαβάστε μια πραγματική μεταβλητή inpBinFile.read((char*)&c, sizeof (c));

//διαβάστε μια συμβολική μεταβλητή

inpBinFile.close(); cout

Αποτέλεσμα του προγράμματος:

a = 145687 x = 123,25 s = g

Λάβετε υπόψη ότι δεν πραγματοποιείται μετατροπή πληροφοριών κατά τη χρήση των συναρτήσεων εγγραφής και ανάγνωσης. Η εσωτερική αναπαράσταση των δεδομένων εγγράφεται και διαβάζεται από το αρχείο. Γι' αυτό και τα δύο προηγούμενα προγράμματα έδωσαν το σωστό αποτέλεσμα.

Εγγραφή και ανάγνωση προσαρμοσμένων τύπων δεδομένων σε δυαδικά αρχεία

Σε αντίθεση με τα αρχεία κειμένου, η εργασία με προσαρμοσμένους τύπους δεδομένων χρησιμοποιώντας δυαδικά αρχεία δεν διαφέρει από τους τυπικούς τύπους δεδομένων. Οι μέθοδοι write() και read() χρησιμοποιούνται με παρόμοιο τρόπο. Ο προγραμματιστής πρέπει να υποδείξει μόνο τη διεύθυνση του τμήματος μνήμης που θα γραφτεί και τον αριθμό των byte που θα γραφτούν, λαμβάνοντας υπόψη ότι δεν πραγματοποιείται μετατροπή δεδομένων, γράφεται και διαβάζεται μόνο η εσωτερική αναπαράσταση των πληροφοριών.

Επίσης, όταν εργάζεστε με δυαδικά αρχεία, μπορούν να χρησιμοποιηθούν οι μέθοδοι seekg(), tellg(), seekp(), tellp().

Παράδειγμα 3.Γράψτε ένα πρόγραμμα που γράφει πληροφορίες για μια ομάδα τουριστών σε ένα δυαδικό αρχείο.

fstream BinFile("ankety.bin", ios::in I ios::out | ios::binary);

Anketa Gruppa = ; για (int i = 0; i

BinFile.write((char*)&Gruppa[i], sizeof(Anketa)); BinFile.close(); επιστροφή 0;

Παράδειγμα 4.Το αρχείο "ankety.bin" περιέχει δεδομένα σχετικά με μια ομάδα τουριστών, είναι απαραίτητο να το διαβάσετε και να το εμφανίσετε στην οθόνη.

#include using namespace std; struct ερωτηματολόγιο (

όνομα χαρακτήρα; int ηλικία?

τύπος δομικών δεδομένωνΕρωτηματολόγιο στην οθόνη*/

ostream& χειριστής

fstream BinFile("ankety.bin", ios::in | ios::out | ios::binary); εάν (!BinFile)

για (int i = 0; i

//διαβάστε αμέσως όλα τα byte που καταλαμβάνει η μεταβλητή τύπου Anketa BinFile.read((char*)&Gruppa[i], sizeof(Anketa));

BinFile.close(); επιστροφή 0;

Αποτέλεσμα του προγράμματος:

Ivanov, 23 Sidorov, 21 Petrov, 22

Για να συνεχίσετε, πατήστε οποιοδήποτε πλήκτρο. . .

Ανάπτυξη των δικών σας μαθημάτων για εργασία με αρχεία

Δεν είναι βολικό να χρησιμοποιείτε συνεχώς τις μεθόδους write() και read() είναι πολύ πιο ευχάριστο να μπορείτε να χρησιμοποιείτε τις λειτουργίες ">" κατ' αναλογία με αρχεία κειμένου. Ας δώσουμε ένα παράδειγμα υλοποίησης της τάξης μας για εργασία με δυαδικά αρχεία.

χρησιμοποιώντας namespace std?

struct Ερωτηματολόγιο //δηλώνει μια δομή για την αποθήκευση πληροφοριών

/*Υπερφόρτωση της λειτουργίας εισαγωγής σε μια ροή για προσαρμοσμένη έξοδο

τύπος δομικών δεδομένωνΕρωτηματολόγιο στην οθόνη*/

ostream& χειριστής

κλάση outBinaryFile: δημόσιο της ροής /^ορίστε την τάξη μας για εργασία με δυαδικά αρχεία εξόδου. Το αντλούμε από την κλάση για εργασία με ροές αρχείων εξόδου */

/*όταν περιγράφετε τον κατασκευαστή μιας κλάσης που δημιουργείται, μην ξεχάσετε να καλέσετε τον κατασκευαστή της βασικής κλάσης, περνώντας του τις απαραίτητες παραμέτρους*/

outBinaryFile(char* name) : ofstream (όνομα, ios::out I ios::binary)

//Υπερφόρτωση των απαραίτητων λειτουργιών ως μεθόδων κλάσηςτελεστής outBinaryFile&

write((char*)&chislo, sizeof(chislo)); επιστροφή *αυτό;

τελεστής outBinaryFile&

write((char*)&ank, sizeof(ank)); επιστροφή *αυτό;

κλάση inpBinaryFile: public if stream /* Ορίζουμε την κλάση μας για εργασία με δυαδικά αρχεία εισόδου. Το αντλούμε από την κλάση για εργασία με ροές αρχείων εισόδου */

inpBinaryFile(char* name) : ifstream(name, ios::in I ios::binary)

/* κλήση του κατασκευαστή της βασικής κλάσης με τις απαραίτητες παραμέτρους,

επαρκής για τον κατασκευαστή της παραγόμενης κλάσης */

//Υπερφόρτωση των απαραίτητων λειτουργιών

inpBinaryFile& operator >> (int& αριθμός)

read((char*)&chislo, sizeof(chislo)); επιστροφή *αυτό;

inpBinaryFile& operator >> (Anketa& ank)

read((char*)&ank, sizeof(ank)); επιστροφή *αυτό;

int a = 111, b = 112; outBinaryFile outFile("dannye.bin");

//άνοιξε το αρχείο για ανάγνωση

inpBinaryFile inpFile("dannye.bin"); εάν (!inpFile)

για (int i = 0; i

inpFile >> a; //διαβάστε το προφίλ από το αρχείο

cout //και εμφανίστε το στην οθόνη

inpFile >> ερωτηματολόγιο; cout

Αποτέλεσμα του προγράμματος:

Kolya, 1990, 582-78-95.

Για να συνεχίσετε, πατήστε οποιοδήποτε πλήκτρο. . .

1. Είναι δυνατή η χρήση μιας λειτουργίας σε ένα πρόγραμμα;

ios::σε I ios::out

  • α) ναι σε καμια περιπτωση?
  • β) ναι, αλλά μόνο όταν εργάζεστε με αρχεία κειμένου.
  • γ) όχι, σε κάθε περίπτωση.
  • 2. Καθορίστε τη σωστή επιλογή για το άνοιγμα ενός αρχείου κειμένου για ανάγνωση:
    • α) ifstream inpF("input.txt", ios::in);
    • β) ifstream inpF("input.txt", ios::input);
    • γ) ifstream inpF(ios:in, "input.txt").

Η. Τι θα εμφανιστεί στην οθόνη ως αποτέλεσμα της εκτέλεσης του παρακάτω κώδικα;

inputFile.get(c);

επόμενο - inputFile.peek();

αν (επόμενο == ΕΟΦ)

  • α) τα περιεχόμενα του αρχείου που σχετίζεται με τη ροή inputFile θα εμφανιστούν στην οθόνη μία φορά.
  • β) τα περιεχόμενα του αρχείου που σχετίζονται με τη ροή inputFile θα εμφανίζονται στην οθόνη άπειρες φορές.
  • γ) δεν θα εμφανίζεται τίποτα στην οθόνη.
  • 4. Πόσοι χαρακτήρες υπάρχουν στο αρχείο;
  • 12 3 4 5 6
  • α) 6;
  • β) 7;
  • στις 11.
  • 5. Ποιες μέθοδοι σας επιτρέπουν να προσδιορίσετε το τέλος ενός αρχείου;
  • α) eof();
  • β) καλό();
  • γ) και οι δύο αυτές μέθοδοι.
  • 6. Ποιος είναι ο σκοπός της συνάρτησης getline();
  • α) διαβάζει μια λέξη από ένα αρχείο.
  • β) διαβάζει ολόκληρο το περιεχόμενο του αρχείου.
  • γ) διαβάζει μια γραμμή από ένα αρχείο.
  • 7. Για να γράψετε/διαβάσετε προσαρμοσμένους τύπους δεδομένων σε ένα αρχείο, πρέπει:
    • α) υπερφόρτωση των λειτουργιών ">>" και "
    • β) η εγγραφή και η ανάγνωση προσαρμοσμένων τύπων δεδομένων είναι διαθέσιμα χωρίς πρόσθετες ενέργειες.
    • γ) η εγγραφή και η ανάγνωση προσαρμοσμένων τύπων δεδομένων στο αρχείο είναι αδύνατη.
  • 8. Ποιες συναρτήσεις χρησιμοποιούνται για την εγγραφή/ανάγνωση πληροφοριών σε δυαδική μορφή;
  • α) printf / scanf.
  • β) γράφουν / διαβάζουν?
  • γ) βάζω / παίρνω.
  • 1. Γράψτε ένα πρόγραμμα που γράφει τα γράμματα του αγγλικού αλφαβήτου σε ένα αρχείο.
  • 2. Το αρχείο input.txt περιέχει πληροφορίες από πολλές γραμμές κειμένου. Εμφανίστε τα περιεχόμενα αυτού του αρχείου στην οθόνη, μετρήστε τον αριθμό των γραμμών στο αρχείο.
  • 3. Ο δίσκος περιέχει το αρχείο result.txt με τα αποτελέσματα χημικών πειραμάτων. Γράψτε ένα πρόγραμμα που δημιουργεί ένα αντίγραφο αυτού του αρχείου με το όνομα copy_resylt.txt.
  • 4. Εισαγάγετε το όνομα του αρχείου χρησιμοποιώντας το πληκτρολόγιο. Διαγράψτε όλες τις ζυγές γραμμές στο καθορισμένο αρχείο.
  • 5. Γράψτε ένα πρόγραμμα που, σε ένα αρχείο κειμένου, να αντικαθιστά όλα τα πεζά γράμματα με κεφαλαία και το αντίστροφο.
  • 6. Το αρχείο κειμένου προέλευσης περιέχει αριθμούς διαχωρισμένους με κενά. Δημιουργήστε δύο νέα αρχεία: το πρώτο πρέπει να περιέχει μόνο ζυγούς αριθμούς και το δεύτερο - περιττούς.
  • 7. Το αρχείο περιέχει πραγματικούς αριθμούς. Γράψτε ένα πρόγραμμα που θα απορρίψει το κλασματικό μέρος αυτών των αριθμών και θα τους γράψει σε ένα νέο αρχείο.
  • 8. Ένα αρχείο κειμένου περιέχει πληροφορίες για πτήσεις αεροπορικών εταιρειών. Επιλέξτε πτήσεις που αναχωρούν το απόγευμα από αυτά τα δεδομένα και εμφανίστε τις στην οθόνη.
  • 9. Υπερφορτώστε τους τελεστές >> και
  • 10. Γράψτε τη δική σας τάξη για να εργαστείτε με δυαδικά αρχεία.
  • 11. Γράψτε τη λίστα των 10 μαθητών της τάξης σε ένα αρχείο κειμένου και σε ένα δυαδικό αρχείο. Συγκρίνετε αυτά τα αρχεία. Εξηγήστε τη διαφορά που προκύπτει.
  • 12. Αναπτύξτε μια τάξη που γράφει πληροφορίες για αυτοκίνητα (έτος κατασκευής, μάρκα, χρώμα κ.λπ.) σε ένα αρχείο κειμένου. Σε αυτήν την περίπτωση, κάθε σύμβολο πληροφοριών αντικαθίσταται από τον δικό του κωδικό ABO 1. Εμφανίστε το αρχείο που προκύπτει στην οθόνη.

Ερωτήσεις ελέγχου

  • 1. Ποιες κλάσεις χρησιμοποιούνται για την εργασία με ροές αρχείων;
  • 2. Ποιοι τρόποι πρόσβασης μπορούν να χρησιμοποιηθούν κατά την εργασία με αρχεία; Δώσε παραδείγματα.
  • 3. Ποια μέθοδος χρησιμοποιείται για το άνοιγμα ενός αρχείου; Δώσε παραδείγματα.
  • 4. Ποιες λειτουργίες είναι διαθέσιμες για εργασία με αρχεία; Ποιες λειτουργίες παρέχονται για την εκτέλεση αυτών των λειτουργιών;
  • 5. Ποιες μέθοδοι σας επιτρέπουν να προσδιορίσετε το τέλος ενός αρχείου κατά την ανάγνωση πληροφοριών από αυτό; Ποια είναι η διαφορά μεταξύ αυτών των μεθόδων; Δώσε παραδείγματα.
  • 6. Πώς μπορείτε να διαβάσετε μεταβλητές τυπικών τύπων δεδομένων από αρχεία κειμένου;
  • 7. Είναι δυνατή η ανάγνωση προσαρμοσμένων μεταβλητών τύπων δεδομένων από αρχεία κειμένου;
  • 8. Ποιες λειτουργίες έχουν σχεδιαστεί για την τυχαία ανάγνωση πληροφοριών από ένα αρχείο; Δώσε παραδείγματα.
  • 9. Ονομάστε τα χαρακτηριστικά των δυαδικών αρχείων. Ποια είναι τα πλεονεκτήματα της χρήσης τέτοιων αρχείων;
  • 10. Ποιες λειτουργίες μπορούν να χρησιμοποιηθούν για την εγγραφή/ανάγνωση πληροφοριών σε δυαδικά αρχεία;
  • 11. Πώς να διαβάσετε μεταβλητές τυπικών τύπων δεδομένων από ένα δυαδικό αρχείο;
  • 12. Ποιες σκέψεις πρέπει να λαμβάνονται υπόψη κατά την ανάγνωση προσαρμοσμένων τύπων δεδομένων από δυαδικά αρχεία;
  • "Ivanov", 23), ("Sidorov", 21),

Τα παραδείγματα που έχουμε εξετάσει μέχρι τώρα έχουν δείξει μορφοποιημένη είσοδο/έξοδο πληροφοριών σε αρχεία. Συνιστάται η χρήση μορφοποιημένων αρχείων εισόδου/εξόδου αριθμών μόνο όταν είναι μικροί σε μέγεθος και ποσότητα, καθώς και όταν είναι απαραίτητο να παρέχεται η δυνατότητα προβολής αρχείων με χρήση μη προγραμματικών μέσων. Διαφορετικά, φυσικά, είναι πολύ πιο αποτελεσματικό να χρησιμοποιείτε δυαδικό I/O, το οποίο αποθηκεύει αριθμούς με τον ίδιο τρόπο όπως στο OP του υπολογιστή, παρά ως συμβολοσειρές χαρακτήρων. Επιτρέψτε μου να σας υπενθυμίσω ότι μια ακέραια (int) ή πραγματική (float) τιμή καταλαμβάνει 4 byte στη μνήμη, μια διπλή τιμή παίρνει 8 byte και μια τιμή char παίρνει 1 byte. Για παράδειγμα, ο αριθμός 12345 σε ένα αρχείο κειμένου (μορφοποιημένο) παίρνει 5 byte και σε ένα δυαδικό αρχείο 4 byte.

Δυαδικά αρχεία, δηλ. Τα αρχεία στα οποία είναι αποθηκευμένες οι πληροφορίες σε μια εσωτερική φόρμα αναπαράστασης χρησιμοποιούνται για μεταγενέστερη χρήση από το λογισμικό, δεν μπορούν να προβληθούν εκτός λογισμικού. Το πλεονέκτημα των δυαδικών αρχείων είναι ότι, πρώτον, κατά την ανάγνωση/εγγραφή, δεν χάνεται χρόνος για τη μετατροπή δεδομένων από τη συμβολική μορφή αναπαράστασης στην εσωτερική και αντίστροφα, και δεύτερον, δεν χάνεται η ακρίβεια των πραγματικών αριθμών. Τόσο στην περίπτωση της μορφοποιημένης εισόδου/εξόδου όσο και στην περίπτωση της δυαδικής εισόδου/εξόδου, για να επεξεργαστείτε «σωστά» πληροφορίες από ένα αρχείο, πρέπει να γνωρίζετε ποιοι τύποι δεδομένων, πώς και με ποια σειρά γράφονται στο δυαδικό αρχείο αρχείο, ειδικά επειδή η προβολή ενός δυαδικού αρχείου χρησιμοποιώντας ένα πρόγραμμα επεξεργασίας κειμένου δεν θα κάνει τίποτα.

Ας εξετάσουμε ένα παράδειγμα που δείχνει την εγγραφή ακέραιων στοιχείων ενός δυναμικού πίνακα σε ένα δυαδικό αρχείο και την ανάγνωσή τους από αυτό το αρχείο.

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

χρησιμοποιώντας namespace std?

cout<< "Vvedite kol-vo elementov celochisl. massiva: "; cin >> N;

int *mas = νέο int [N];

για(i=0; i

cout<< " Vvedite " << i << "-i element: "; cin >> mas[i];

cout<< "\nIdet zapis dannyh v fail..." << endl;

ofstream fout("c:\\os\\bin.dat", ios::binary);//δημιουργήθηκε έξοδος δυαδική ροή

αν(!fout) (cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

fout.write(reinterpret_cast (mas), N*sizeof(int));//εγγραφή πίνακα σε αρχείο

fout.close();//κλείσιμο της ροής

cout<< "Dannye uspeshno zapisany!" << endl;

για(i=0; i

ifstream fin("c:\\os\\bin.dat", ios::binary); //δημιουργήστε ένα νήμα για να διαβάσετε το αρχείο

if(!fin) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

cout<< "Fail sodergit:" << endl;

fin.read(reinterpret_cast (mas), N*sizeof(int));//ανάγνωση πίνακα από αρχείο

για(i=0; i

getch(); επιστροφή 0;

Σε αυτό το πρόγραμμα, πρέπει να δοθεί ιδιαίτερη προσοχή στη χρήση των συναρτήσεων write() (μέθοδος κλάσης offstream) και read() (μέθοδος κλάσης ifstream). Αυτές οι συναρτήσεις θεωρούν δεδομένα ως byte και έχουν σχεδιαστεί για να μεταφέρουν έναν ορισμένο αριθμό byte από μια προσωρινή μνήμη δεδομένων σε ένα αρχείο και πάλι πίσω. Οι παράμετροι αυτών των συναρτήσεων είναι η διεύθυνση buffer και το μήκος της σε byte.

Η συνάρτηση write() έχει σχεδιαστεί για να γράφει σε ένα αρχείο τον αριθμό των byte που καθορίζονται στη δεύτερη παράμετρο από αυτά που καθορίζονται στην πρώτη παράμετρο διευθύνσεις buffer δεδομένων και η συνάρτηση read() έχει σχεδιαστεί για να διαβάζει δεδομένα από ένα αρχείο. Θα πρέπει να σημειωθεί εδώ ότι αυτές οι λειτουργίες λειτουργούν μόνο με buffer δεδομένων τύπου char. Από αυτή την άποψη, σε αυτό το πρόγραμμα χρησιμοποιήσαμε τον τελεστή reinterpret_cast<> που μετατρέπει το buffer δεδομένων μας τύπου int (mas) σε buffer τύπου char.

Είναι σημαντικό να θυμάστε ότι η χύτευση χρησιμοποιώντας τον χειριστή reinterpret_cast απαραίτητο μόνο σε περιπτώσεις όπου η πρώτη παράμετρος των συναρτήσεωνγράφω() Καιανάγνωση() δεν είναι πίνακας χαρακτήρων (εξάλλου, χαρακτήρας τύπουαπανθρακώνω παίρνει μόνο 1 byte).Επιπλέον, εάν χρειάζεται να γράψετε ή να διαβάσετε όχι έναν πίνακα, αλλά μεμονωμένες μεταβλητές, τότε πρέπει να χρησιμοποιήσετε έναν μηχανισμό αναφοράς (ένα σύνδεσμο προς τη διεύθυνση του buffer δεδομένων), για παράδειγμα:

ofstream fout(όνομα αρχείου, ios::app | ios::binary);

fout.write(reinterpret_cast (& cb), sizeof(float));

Τώρα είναι απαραίτητο να συζητήσουμε τη δεύτερη παράμετρο των υπό εξέταση συναρτήσεων. Σε αυτό το πρόγραμμα, ως δεύτερη παράμετρο χρησιμοποιήσαμε την έκφραση N*sizeof(int), με την οποία υπολογίσαμε τον αριθμό των byte. Για παράδειγμα, εάν έχουμε 5 ακέραια στοιχεία πίνακα, τότε ο αριθμός των byte θα είναι 20. Η συνάρτηση sizeof() επιστρέφει τον αριθμό των byte που έχουν εκχωρηθεί για τον τύπο δεδομένων που καθορίζεται ως παράμετρος. Για παράδειγμα, sizeof( ενθ) θα επιστρέψει 4.

Έτσι, το πρόγραμμα που δίνεται σε αυτό το παράδειγμα σάς επιτρέπει να γράψετε δεδομένα σε δυαδική μορφή στο αρχείο bin.dat και να τα διαβάσετε από αυτό το δυαδικό αρχείο. Επιπλέον, μετά την ανάγνωση, αυτά τα δεδομένα μετατρέπονται στον τύπο int, αποκτούν δομή πίνακα και μπορούν να εκτελεστούν οποιεσδήποτε λειτουργίες με αυτόν.

Τώρα, φανταστείτε ότι πρέπει να γράψετε ένα πρόγραμμα που σας επιτρέπει να διαβάζετε δεδομένα από το αρχείο bin.dat και γνωρίζουμε μόνο ότι αυτό το αρχείο περιέχει τα στοιχεία ενός ακέραιου πίνακα σε δυαδική μορφή. Αριθμός στοιχείων που γράφτηκαν (Ν ) δεν ξέρουμε. Κατά τη δημιουργία ενός προγράμματος, δεν έχουμε το δικαίωμα να χρησιμοποιήσουμε σταθερό πίνακα, π.χ. εκχωρήστε μνήμη για αυτό στο στάδιο της δημιουργίας του προγράμματος. Αυτό θα οδηγήσει σε λανθασμένο αποτέλεσμα. Επειδή μια πολύ μικρή τιμή για το N θα έχει ως αποτέλεσμα να μην μετρώνται όλα τα στοιχεία του πίνακα και μια πολύ μεγάλη τιμή για το N θα έχει ως αποτέλεσμα την πλήρωση επιπλέον κελιών με τυχαίες τιμές.

Ας εξετάσουμε ένα παράδειγμα ενός προγράμματος που σας επιτρέπει να διαβάσετε τα στοιχεία ενός ακέραιου πίνακα από ένα δυαδικό αρχείο με δυναμική κατανομή μνήμης και για να αποδείξετε τον ρεαλισμό των δεδομένων ανάγνωσης, να υπολογίσετε το άθροισμά τους.

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

χρησιμοποιώντας namespace std?

int N, i, sum=0, dfb; //dfb - μήκος αρχείου σε byte

ifstream fin("c:\\os\\bin.dat", ios::binary);

if(!fin) ( cout<< "Oshibka otkrytiya faila!"; getch(); return 1; }

fin.seekg(0, ios::end);//ορίστε τη θέση ανάγνωσης στο τέλος του αρχείου (0 byte από το τέλος)

dfb = fin.tellg();//λάβετε την τιμή της θέσης τέλους αρχείου (σε byte)

N=dfb/4;//γνωρίζοντας ότι ένας ακέραιος παίρνει 4 byte, υπολογίστε τον αριθμό των αριθμών

int *arr = new int [N];//δημιουργία δυναμικού πίνακα

fin.seekg(0, ios::beg);//πριν από την ανάγνωση δεδομένων, μετακινήστε την τρέχουσα θέση στην αρχή του αρχείου

fin.read(reinterpret_cast (arr), dfb);

cout<< "Iz faila schitano " << N << " elementov:" << endl;

για(i=0; i

για(i=0; i

cout<< "\n Ih summa = " << sum;

getch(); επιστροφή 0;

Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτό το πρόγραμμα, στο οποίο χρησιμοποιήσαμε ενεργά τις συναρτήσεις seekg() και tellg(), που είναι μέθοδοι της κλάσης ifstream. Εδώ πρέπει να σημειωθεί ότι Οποιοδήποτε αρχείο όταν ανοίγει σχετίζεται με μια λεγόμενη τρέχουσα θέση ανάγνωσης ή εγγραφής. Όταν ένα αρχείο ανοίγει για ανάγνωση, αυτή η προεπιλεγμένη θέση ορίζεται στην αρχή του αρχείου. Αλλά αρκετά συχνά είναι απαραίτητο να ελέγχετε τη θέση χειροκίνητα για να μπορείτε να διαβάζετε και να γράφετε ξεκινώντας από μια αυθαίρετη θέση στο αρχείο. Οι συναρτήσεις seekg() και tellg() σας επιτρέπουν να ορίσετε και να ελέγξετε τον τρέχοντα δείκτη ανάγνωσης, ενώ οι συναρτήσεις seekp() και tellp() κάνουν το ίδιο για τον δείκτη εγγραφής.

Η μέθοδος seekg(1_parameter, 2_parameter) μετακινεί την τρέχουσα θέση ανάγνωσης από το αρχείο κατά τον αριθμό των byte που καθορίζονται στην 1_parameter σε σχέση με τη θέση που καθορίζεται στη 2nd_parameter. Το 2_parameter μπορεί να λάβει μία από τις τρεις τιμές:

ios::beg – από την αρχή του αρχείου.

ios::cur – από την τρέχουσα θέση;

ios::end – από το τέλος του αρχείου.

Εδώ beg, cur και end είναι σταθερές που ορίζονται στην κλάση ios και τα σύμβολα:: αντιπροσωπεύουν τη λειτουργία πρόσβασης σε αυτήν την κλάση. Για παράδειγμα, ο χειριστής fin.seekg(-10, ios::end);σας επιτρέπει να ορίσετε την τρέχουσα θέση ανάγνωσης από ένα αρχείο σε 10 byte πριν από το τέλος του αρχείου.

Τώρα ας επιστρέψουμε στην περιγραφή της λειτουργίας του προγράμματος. Με βάση το γεγονός ότι δεν γνωρίζουμε τον αριθμό των αριθμών που γράφτηκαν στο αρχείο, πρέπει πρώτα να μάθουμε τον αριθμό των αριθμών. Για να γίνει αυτό, χρησιμοποιώντας fin.seekg(0, ios::end);μεταβαίνουμε στο τέλος του αρχείου και, χρησιμοποιώντας τη συνάρτηση tellg(), επιστρέφουμε το μήκος του αρχείου σε byte στη μεταβλητή dfb. Η συνάρτηση tellg() επιστρέφει την τρέχουσα θέση του δείκτη σε byte. Δεδομένου ότι γνωρίζουμε το μήκος ενός ακέραιου σε byte (4 byte), είναι εύκολο να υπολογίσουμε τον αριθμό των αριθμών που γράφτηκαν στο αρχείο, γνωρίζοντας το μήκος του αρχείου σε byte ( N=dfb/4;). Αφού μάθαμε τον αριθμό των αριθμών, δημιουργούμε έναν δυναμικό πίνακα και μετακινούμαστε στην αρχή του αρχείου για να ξεκινήσουμε την ανάγνωση δεδομένων χρησιμοποιώντας τη συνάρτηση read(). Αφού μεταφερθεί ο καθορισμένος αριθμός byte δεδομένων (dfb) στην προσωρινή μνήμη δεδομένων (arr), τα δεδομένα που διαβάζονται με αυτόν τον τρόπο αποκτούν μια δομή πίνακα και γίνονται πλήρως κατάλληλα για οποιεσδήποτε λειτουργίες κώδικα και μετασχηματισμούς.

Αρχεία. Επιπλέον, από την άποψη της τεχνικής υλοποίησης σε επίπεδο υλικού, τα αρχεία κειμένου είναι μια ειδική περίπτωση δυαδικών αρχείων, και έτσι, με την ευρεία έννοια της λέξης, κάθε αρχείο ταιριάζει στον ορισμό του «δυαδικού αρχείου».

Γενικά, αυτός ο όρος αντιπροσωπεύει ένα μέτρο της σχέσης μεταξύ του καταναλωτή ενός δυαδικού αρχείου και του ίδιου του αρχείου. Εάν ο καταναλωτής γνωρίζει τη δομή και τους κανόνες με τους οποίους μπορεί να μετατρέψει ένα δεδομένο αρχείο σε υψηλότερου επιπέδου, τότε δεν είναι δυαδικό για αυτόν. Για παράδειγμα, τα εκτελέσιμα αρχεία είναι δυαδικά για τον χρήστη του υπολογιστή, αλλά δεν είναι δυαδικά για το λειτουργικό σύστημα. [ ]

Οραματισμός

Για την οπτική αναπαράσταση ενός δυαδικού αρχείου, χωρίζεται σε κομμάτια ίσου μεγέθους, που αναπαρίστανται ως αριθμοί, συνήθως γραμμένοι σε δεκαεξαδικό, μερικές φορές σε οκταδικό, δυαδικό ή δεκαδικό. Το υποδεικνυόμενο μέγεθος κομματιού μπορεί να είναι ίσο με μία οκτάδα, καθώς και με δύο ή τέσσερα (στην περίπτωση διαχωρισμού σε κομμάτια πολλών οκτάδων, χρησιμοποιείται η σειρά byte που υιοθετείται στην πλατφόρμα που χρησιμοποιείται). Η εξάρτηση του εύρους των αντιπροσωπευόμενων αριθμών από το μέγεθος του κομματιού φαίνεται στον πίνακα:

οκτάδες αριθμός bit δεκαεξαδικό οκτάεδρος δεκαδικός
ανυπόγραφο
δεκαδικός
εικονική
1 8 00

FF
000

377
0

255
-128

127
2 16 0000

FFFF
000000

177777
0

65535
-32768

32767
4 32 00000000

ΦΦΦΦΦΦΦΦ
00000000000

37777777777
0

4294967295
-2147483648

2147483647

Συχνά, εκτός από τις αριθμητικές τιμές byte, εξάγονται και χαρακτήρες κωδικοσελίδων, όπως ASCII. Το παρακάτω παράδειγμα δείχνει το λεγόμενο. κλασική χωματερή(δεκαεξαδική αναπαράσταση οκτάδα προς οκτάδα 16 byte ανά γραμμή, με εκτυπώσιμους χαρακτήρες ASCII στα δεξιά) της αρχής του αρχείου PNG με το λογότυπο της Wikipedia:

00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG.........IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |............| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 |.....gAMA.....OX| 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2....tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 |dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@...OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99......55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777...%%%...| 000000a0 27 27 27 1a 1a 1a 38 38 38 2a 2a 2a 08 08 08 20 |"""...888**... | 000000b0 20 17 17 17 38 2e |. ...........|

Εργαλεία

Για οπτικοποίηση

  • εντοπισμός σφαλμάτων (σε Microsoft Windows, μερικώς)
  • hexdump (σε FreeBSD, GNU/Linux, κ.λπ.)

Για επεξεργασία

  • Συντάκτης HEX
    • beye (για όλα τα λειτουργικά συστήματα, δωρεάν λογισμικό)
    • hiew (για DOS, Microsoft Windows, Windows NT)
    • WinHex (για Windows)

Αρχεία. Επιπλέον, από την άποψη της τεχνικής υλοποίησης σε επίπεδο υλικού, τα αρχεία κειμένου είναι μια ειδική περίπτωση δυαδικών αρχείων, και έτσι, με την ευρεία έννοια της λέξης, κάθε αρχείο ταιριάζει στον ορισμό του «δυαδικού αρχείου».

Τα δυαδικά αρχεία χρησιμοποιούνται συχνά για αναφορά σε εκτελέσιμα αρχεία και συμπιεσμένα δεδομένα, αλλά είναι λάθος να περιοριστεί αυτή η έννοια με τέτοιο τρόπο.

Οραματισμός

Για την οπτική αναπαράσταση ενός δυαδικού αρχείου, χωρίζεται σε κομμάτια ίσου μεγέθους, που αναπαρίστανται ως αριθμοί, συνήθως γραμμένοι σε δεκαεξαδικό, μερικές φορές σε οκταδικό, δυαδικό ή δεκαδικό. Το υποδεικνυόμενο μέγεθος κομματιού μπορεί να είναι ίσο με μία οκτάδα, καθώς και με δύο ή τέσσερα (στην περίπτωση διαχωρισμού σε κομμάτια πολλών οκτάδων, χρησιμοποιείται η σειρά byte που υιοθετείται στην πλατφόρμα που χρησιμοποιείται). Η εξάρτηση του εύρους των αντιπροσωπευόμενων αριθμών από το μέγεθος του κομματιού φαίνεται στον πίνακα:

οκτάδες αριθμός bit δεκαεξαδικό οκτάεδρος δεκαδικός
ανυπόγραφο
δεκαδικός
εικονική
1 8 00

FF
000

377
0

255
-128

127
2 16 0000

FFFF
000000

177777
0

65535
-32768

32767
4 32 00000000

ΦΦΦΦΦΦΦΦ
00000000000

37777777777
0

4294967295
-2147483648

2147483647

Συχνά, εκτός από τις αριθμητικές τιμές byte, εμφανίζονται και χαρακτήρες της κωδικοσελίδας, για παράδειγμα, με τυπωμένους χαρακτήρες ASCII στα δεξιά) στην αρχή του αρχείου PNG με το λογότυπο της Wikipedia:

00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG.........IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |............| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 |.....gAMA.....OX| 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2....tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 |dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@...OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99......55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777...%%%...| 000000A0 27 27 27 1A 1A 1A 38 38 38 2A 2A 2A 08 08 08 20 | "" "888 *** ... | 000000B0 20 17 17 17 17 2e 2e 2e 13 13 13 13 BB BB BB 88 88 | .............|

Εργαλεία

Για οπτικοποίηση

  • εντοπισμός σφαλμάτων (σε Microsoft Windows, μερικώς)
  • hexdump (σε GNU/Linux, κ.λπ.)

Για επεξεργασία

Βιβλιογραφία

  • Webster's New World Dictionary of Computer Terms, 4ο. Ed, Prentice Hall, NY, 1992. ISBN 0-671-84651-5
  • Leontyev B.K Μορφές αρχείων Microsoft Windows XP: Κατάλογος, M.: JSC “New Publishing House”, 2005. ISBN 5-9643-0059-6.

Ίδρυμα Wikimedia.

2010.

    Δείτε τι είναι το "Δυαδικό αρχείο" σε άλλα λεξικά: Ουσιαστικό, μ., χρησιμοποιημένος. συγκρίνω συχνά Μορφολογία: (όχι) τι; αριθμός αρχείου; αρχείο, (δείτε) τι; αρχείο, τι; αρχείο, για τι; για το αρχείο? pl. Τι; αρχεία, (όχι) τι; αρχεία, τι; αρχεία, (βλέπω) τι; αρχεία, τι; αρχεία, για τι; σχετικά με τα αρχεία 1. Ένα αρχείο είναι ένας πίνακας... ...

    Επεξηγηματικό Λεξικό του Ντμίτριεφ

    Δυαδικό αρχείο με την ευρεία έννοια: μια ακολουθία αυθαίρετων byte. Το όνομα οφείλεται στο γεγονός ότι τα byte αποτελούνται από bit, δηλαδή δυαδικά ψηφία. Με τη στενή έννοια της λέξης, τα δυαδικά αρχεία αντιτίθενται... ... Wikipedia

    αρχείο ρυθμίσεων- Ένα δυαδικό αρχείο ή αρχείο κειμένου που περιέχει πληροφορίες που καθορίζουν τη συμπεριφορά μιας εφαρμογής, υπολογιστή ή συσκευής δικτύου. Αρχείο διαμόρφωσης θεμάτων δικτύου υπολογιστών EN...

    Οδηγός Τεχνικού Μεταφραστή

    Αυτός ο όρος έχει άλλες έννοιες, βλέπε IPA (έννοιες). Μορφή .IPA για αρχεία αρχειοθέτησης εφαρμογών Apple για iPhone, iPod Touch και iPad. Τα αρχεία με αυτήν την επέκταση αποθηκεύονται στο App Store και γίνονται λήψη με χρήση του iTunes για... ... Wikipedia

    Αυτό το άρθρο ή ενότητα χρειάζεται αναθεώρηση. Δεν υπάρχουν ενότητες, OOP ή άλλες νέες τάσεις στο Pascal. Περιγραφές επεκτάσεων θα πρέπει να υπάρχουν μόνο σε άρθρα σχετικά με την αντίστοιχη ... Wikipedia

    Pascal Semantics: procedural Τύπος εκτέλεσης: μεταγλωττιστής Εμφανίστηκε το: 1970 Συγγραφέας: Niklaus Wirth Η Pascal είναι μια υψηλού επιπέδου γλώσσα προγραμματισμού γενικής χρήσης. Μία από τις πιο διάσημες γλώσσες προγραμματισμού, ευρέως... ... Wikipedia

    Όνομα Gopher: Θύρα/Αναγνωριστικό Gopher: 70/TCP Προδιαγραφή: RFC 1436 Κύριες εφαρμογές (πελάτες): Mozilla Firefox, Microsoft Windows: IE 5.x, IE 6 (περιορίζεται σε MS) Πρωτόκολλο δικτύου Gopher για κατανεμημένη ανάκτηση και μεταφορά εγγράφων, παλαιότερα ευρέως χρησιμοποιούμενο ... Wikipedia

    Όνομα: Gopher Port/ID: 70/TCP Προδιαγραφή: RFC 1436 Κύριες υλοποιήσεις (πελάτες): Mozilla Firefox, Microsoft Windows: Internet Explorer 5.x, Internet Explorer 6 (περιορίζεται σε MS) Πρωτόκολλο δικτύου Gopher για κατανεμημένη αναζήτηση και μετάδοση.. ... Βικιπαίδεια

- / * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Σημείωση: Επειδή η επέκταση ονόματος αρχείου μπορεί να είναι οποιαδήποτε, η λίστα που παρέχεται δεν είναι πλήρης... Wikipedia

Στο παραπάνω παράδειγμα, η "μεγαλύτερη" επιλογή είναι "b": απαιτεί 23 byte (21 byte για τη συμβολοσειρά και 2 byte για τον ακέραιο). Οι επιλογές "n" και "m" απαιτούν 4 και 5 byte αντίστοιχα (βλ. πίνακα). όνομα, στοιχείο εκδότη

Παραλλαγή μέρος

Δυαδικά αρχεία

Επιπλέον, τα αρχεία κειμένου ταξινομούνται ως δομές διαδοχικής πρόσβασης, ενώ τα δυαδικά αρχεία ταξινομούνται ως δομές άμεσης πρόσβασης. Αυτό σημαίνει ότι ανά πάσα στιγμή μπορείτε να έχετε πρόσβαση σε οποιονδήποτε, όχι μόνο στο τρέχον στοιχείο του δυαδικού αρχείου.

Δακτυλογραφημένα αρχεία

Οι μεταβλητές δομημένων τύπων δεδομένων (εκτός από τη συμβολοσειρά) δεν μπορούν να διαβαστούν από ένα αρχείο κειμένου. Για παράδειγμα, εάν πρέπει να εισαγάγετε δεδομένα από ένα αρχείο κειμένου για να συμπληρώσετε το αρχείο του παιχνιδιού με πληροφορίες σχετικά με παιχνίδια που είναι διαθέσιμα προς πώληση (όνομα προϊόντος, τιμή προϊόντος και εύρος ηλικίας για το οποίο προορίζεται το παιχνίδι):

ηλικία: σετ 0..18; (καθορίζεται στο αρχείο με όρια)

τότε θα πρέπει να γράψετε τον παρακάτω κώδικα:

c:char; i,j,min,max: ακέραιος;

α: σειρά παιχνιδιών.

start assign(f,input); επαναφορά (f);

για i:=1 έως 100 κάντε αν όχι eof(f)

τότε με ένα[i] do

έναρξη ανάγνωσης (f, όνομα, τιμή, ελάχιστη, μέγ.) ηλικία:=;

για j:= ελάχιστα έως μέγιστο do age:=age+[j];

Όπως μπορείτε να δείτε, μια τέτοια ανάγνωση στοιχείο προς στοιχείο είναι πολύ άβολη και απαιτεί εργασία.

Προσφέρεται διέξοδος από αυτή την κατάσταση δακτυλογραφημένα αρχεία- τα στοιχεία τους μπορούν να ανήκουν σε οποιονδήποτε βασικό ή δομημένο τύπο δεδομένων. Ο μόνος περιορισμός είναι ότι όλα τα στοιχεία πρέπει να είναι του ίδιου τύπου. Αυτή η φαινομενική ταλαιπωρία είναι

μια απαραίτητη προϋπόθεση για την οργάνωση της άμεσης πρόσβασης στα στοιχεία ενός δυαδικού αρχείου: όπως στην περίπτωση των πινάκων, εάν το μήκος κάθε στοιχείου της δομής είναι γνωστό ακριβώς, τότε η διεύθυνση οποιουδήποτε στοιχείου μπορεί να υπολογιστεί χρησιμοποιώντας έναν πολύ απλό τύπο:

<начало_структуры> + <номер_компонента>*<длина_компонента>

Περιγραφή πληκτρολογημένων αρχείων

Στην ενότητα var υπάρχουν μεταβλητές αρχείων που έχουν σχεδιαστεί για εργασία δακτυλογραφημένα αρχεία, περιγράφονται ως εξής:

var<файловая_перем>: αρχείο του<тип_элементов_файла>;

Καμία μεταβλητή αρχείου δεν μπορεί να καθοριστεί ως σταθερά.

Σκοπός ενός πληκτρολογημένου αρχείου

Από εδώ και πέρα ​​μέχρι το τέλος της ενότητας, με τη λέξη "αρχείο" θα εννοούμε " δυαδικό πληκτρολογημένο αρχείο" (φυσικά, εκτός αν αναφέρεται διαφορετικά).

Ομάδα εκχωρώ(f"<имя_файла>"); χρησιμεύει για τη δημιουργία σύνδεσης μεταξύ της μεταβλητής αρχείουf και του ονόματος του αρχείου για το οποίο αυτή η μεταβλητή θα είναι υπεύθυνη να λειτουργεί.

Γραμμή"<имя_файла>" μπορεί να περιέχει την πλήρη διαδρομή προς το αρχείο. Εάν η διαδρομή δεν έχει καθοριστεί, το αρχείο θεωρείται ότι βρίσκεται στον ίδιο κατάλογο με την εκτελέσιμη λειτουργική μονάδα του προγράμματος.

Άνοιγμα και κλείσιμο ενός πληκτρολογημένου αρχείου

Ανάλογα με τις ενέργειες που πρόκειται να εκτελέσει το πρόγραμμά σας με το άνοιγμα του αρχείου, μπορεί να ανοίξει με δύο τρόπους:

επαναφορά (f); - άνοιγμα ενός αρχείου για ανάγνωση πληροφοριών από αυτό και ταυτόχρονα εγγραφή σε αυτό (αν δεν υπάρχει τέτοιο αρχείο, μια προσπάθεια να το ανοίξετε θα προκαλέσει σφάλμα). Η ίδια εντολή χρησιμοποιείται για την επιστροφή ενός δείκτη στην αρχή του αρχείου.

ξαναγράψω(f); - άνοιγμα ενός αρχείου για να γράψετε πληροφορίες σε αυτό. αν δεν υπάρχει τέτοιο αρχείο, θα δημιουργηθεί. Εάν υπάρχει ήδη ένα αρχείο με το ίδιο όνομα, όλες οι πληροφορίες που περιέχονταν προηγουμένως σε αυτό θα εξαφανιστούν.

κλείνουν δακτυλογραφημένα αρχείαδιαδικασία close(f) , κοινή σε όλους τους τύπους αρχείων.

Ανάγνωση από πληκτρολογημένο αρχείο

Η ανάγνωση από ένα αρχείο που είναι ανοιχτό για ανάγνωση γίνεται χρησιμοποιώντας την εντολή read(). Σε παρένθεση, υποδεικνύεται πρώτα το όνομα της μεταβλητής αρχείου και μετά η λίστα εισόδου1):

Μπορείτε να εισαγάγετε μόνο μεταβλητές του τύπου που αντιστοιχούν στη δήλωση από ένα αρχείο, αλλά αυτός ο τύπος δεδομένων μπορεί επίσης να δομηθεί. Ας πούμε, αν επιστρέψουμε στο παράδειγμα που δόθηκε στην αρχή της παραγράφου. Δακτυλογραφημένα αρχεία», θα γίνει φανερό ότι η χρήση δακτυλογραφημένο αρχείοαντί για κείμενο θα μειώσει σημαντικά το κείμενο του προγράμματος:

τύπος παιχνίδι = όνομα δίσκου: κορδόνι; τιμή: πραγματική;

ηλικία: σετ 0..18; (καθορίζεται από τα όρια)

var f: αρχείο του παιχνιδιού;

α: σειρά παιχνιδιών. αρχίζουν

assign(f,input);

για i:=1 έως 100 κάνω

αν όχι eof(f) τότε διαβάστε(f,a[i]); close(f);

Αναζήτηση σε ένα πληκτρολογημένο αρχείο

Η συνάρτηση eof(f:file):boolean, ήδη γνωστή σε εμάς, αναφέρει όταν έχει φτάσει το τέλος του αρχείου. Όλες οι άλλες συναρτήσεις "τελικής αναζήτησης" (eoln(), seekeof() και seekeoln()) που είναι εγγενείς στα αρχεία κειμένου δεν μπορούν να εφαρμοστούν σε πληκτρολογημένα αρχεία.

Υπάρχουν όμως ειδικές υπορουτίνες που σας επιτρέπουν να εργαστείτε δακτυλογραφημένα αρχείαόπως και με τις δομές άμεσης πρόσβασης:

1. Η συνάρτηση filepos(f:file):longint θα αναφέρει την τρέχουσα θέση του δείκτη στο filef. Εάν δείχνει στο τέλος ενός αρχείου που περιέχει N στοιχεία, τότε αυτή η συνάρτηση θα επιστρέψει το αποτέλεσμα N . Αυτό είναι εύκολο να εξηγηθεί: τα στοιχεία του αρχείου αριθμούνται ξεκινώντας από το μηδέν, επομένως το τελευταίο στοιχείο αριθμείται N-1. Και έτσι ο αριθμόςN ανήκει σε ένα «ανύπαρκτο» στοιχείο - ένα σημάδι του τέλους του αρχείου.

2. Η συνάρτηση filesize(f:file):longint θα υπολογίσει το μήκος του αρχείου f .

3. Η διαδικασία seek(f:file,n:longint) θα μετακινήσει τον δείκτη στο αρχείο f στην αρχή του αριθμού εγγραφής N . Εάν αποδειχθεί ότι το n είναι μεγαλύτερο από το πραγματικό μήκος του αρχείου, τότε ο δείκτης θα μετακινηθεί πέρα ​​από το πραγματικό τέλος του αρχείου.

4. Η διαδικασία περικοπή (f:file) θα περικόψει την "ουρά" του αρχείου: όλα τα στοιχεία από το τρέχον έως το τέλος του αρχείου θα αφαιρεθούν από αυτό. Στην πραγματικότητα, μόνο το σύμβολο "τέλος αρχείου" θα ξαναγραφεί στο σημείο όπου έδειξε ο δείκτης και οι φυσικές τιμές "αποκοπής" θα παραμείνουν στις αρχικές τους θέσεις - απλώς θα μείνουν "ορφανές".

Γράψιμο σε ένα Δακτυλογραφημένο αρχείο

Μπορείτε να αποθηκεύσετε μεταβλητές σε ένα αρχείο που είναι ανοιχτό για εγγραφή χρησιμοποιώντας την εντολή write(). Όπως και με την ανάγνωση, η μεταβλητή αρχείου παρατίθεται πρώτη, ακολουθούμενη από τη λίστα εξόδου:

write(f,a,b,c); - εγγραφή στο filef (που είχε ανοίξει προηγουμένως για εγγραφή με τις εντολές rewrite(f) ή reset(f) ) μεταβλητές a, b, c.

Έξοδος σε δακτυλογραφημένο αρχείοΕπιτρέπονται μόνο μεταβλητές που αντιστοιχούν στην περιγραφή του τύπου δεδομένων. Δεν μπορούν να εκτυπωθούν σταθερές χωρίς όνομα και χωρίς πληκτρολόγηση

δακτυλογραφημένο αρχείο.

Δακτυλογραφημένα αρχείαθεωρούνται δομές άμεσης και διαδοχικής πρόσβασης. Αυτό σημαίνει ότι η εγγραφή είναι δυνατή όχι μόνο στο τέλος του αρχείου, αλλά και σε οποιοδήποτε άλλο στοιχείο. Η τιμή που γράφτηκε θα αντικαταστήσει την προηγούμενη τιμή σε αυτό το στοιχείο (η παλιά τιμή θα "αντικατασταθεί").

Για παράδειγμα, εάν πρέπει να αντικαταστήσετε το πέμπτο στοιχείο ενός αρχείου με την τιμή που είναι αποθηκευμένη στη μεταβλητή a, τότε θα γράψετε το ακόλουθο απόσπασμα προγράμματος:

seek(f,5); (ο δείκτης θα οριστεί στην αρχή του 5ου στοιχείου)

write(f,a); (ο δείκτης θα οριστεί στην αρχή του 6ου στοιχείου)



Συνιστούμε να διαβάσετε

Μπλουζα