Συνάρτηση C++ Seekg().

Synartese C Seekg



Στον προγραμματισμό C++, η συνάρτηση seekg() παρέχει βοήθεια στις ροές αρχείων. Είναι μέλος της βιβλιοθήκης iostream και θα το βρείτε στην κεφαλίδα . Αυτή η λειτουργία επιτρέπει στους προγραμματιστές να χειρίζονται πού ξεκινά η επόμενη λειτουργία εισόδου, απλοποιώντας έτσι τη διαδικασία εργασίας με αρχεία. Η μέθοδος seekg() σάς επιτρέπει να μεταβείτε σε μια συγκεκριμένη τοποθεσία σε ένα αρχείο, η οποία είναι ανεκτίμητη όταν χρειάζεται να διαβάσετε ή να επεξεργαστείτε τα δεδομένα που δεν είναι οργανωμένα διαδοχικά. Είτε σκοπεύετε να διαβάσετε από την αρχή, τη μέση ή το τέλος ενός αρχείου, η seekg() παρέχει την ευελιξία που απαιτείται για τέτοιες εργασίες. Σε αυτόν τον οδηγό, θα εμβαθύνουμε στο πώς λειτουργεί η seekg() στη C++ επιτρέπει την ανάκτηση δεδομένων από διάφορα σημεία ενός αρχείου.

Σύνταξη και παράμετροι της συνάρτησης Seekg() στη C++

Η Seekg() μπορεί να υλοποιηθεί με δύο συντάξεις:

1. Streampos Syntax

ρεύμα & αναζητώ ( ανάρτηση streampos ) ;

Αυτή η σύνταξη παίρνει μόνο μία παράμετρο, τη θέση, η οποία αντιπροσωπεύει τη θέση του δρομέα στην προσωρινή μνήμη ροής. Αντιπροσωπεύει μια τιμή 'int' και τύπου streampos.







2. Σύνταξη μετατόπισης και κατεύθυνσης

ρεύμα & αναζητώ ( ρέει συχνά , ios_base :: αναζήτηση είναι βρωμιά ) ;

Αυτή η σύνταξη παίρνει δύο παραμέτρους ως είσοδο: μετατόπιση και κατεύθυνση. Η παράμετρος 'ofst' είναι ένας ακέραιος αριθμός τύπου streamoff που υποδεικνύει τη μετατόπιση στο buffer της ροής. Η παράμετρος 'βρωμιά' αναζητά κατεύθυνση.



  • ios_base::beg: Μετατόπιση από την αρχή του buffer της ροής.
  • ios_base::cur: Μετατόπιση από την τρέχουσα θέση στο buffer της ροής.
  • ios_base::end: Μετατόπιση από το τελευταίο buffer της ροής.

Η συνάρτηση seekg() στη C++ χειρίζεται τον δείκτη του αρχείου, επιτρέποντας στον προγραμματιστή να τον τοποθετήσει σε μια συγκεκριμένη θέση μέσα στο αρχείο. Επιστρέφει την τροποποίηση του αντικειμένου 'istream' (*αυτό) και προσαρμόζει τον δείκτη του αρχείου ανάλογα.



Χειρισμός σφαλμάτων και εξαιρέσεων στη συνάρτηση C++ Seekg().

Η συνάρτηση seekg() στη C++ διασφαλίζει τη βασική εγγύηση για το χειρισμό εξαιρέσεων, διατηρώντας την εγκυρότητα του αντικειμένου εάν παρουσιαστεί εξαίρεση. Ενδέχεται να δημιουργήσει τις εξαιρέσεις 'αποτυχίας' όταν η σημαία κατάστασης σφάλματος στερείται πληροφοριών και η συνάρτηση εντοπίζει και διαχειρίζεται υπεύθυνα αυτές τις εξαιρέσεις, επαναφέροντάς τις εάν είχε οριστεί ένα κακό bit στην τελευταία κλήση.





Επιπλέον, ένα κοινό πρόβλημα με το seekg() παρουσιάζεται όταν φτάσει στο τέλος του αρχείου (EOF), με αποτέλεσμα ο δείκτης να παραμείνει ακαθόριστος και να ενεργοποιηθεί ένα σφάλμα. Η μέθοδος clear() χρησιμοποιείται για την επαναφορά του δείκτη και την επίλυση των σφαλμάτων που σχετίζονται με το EOF για να αντιμετωπιστεί αυτό. Επιπλέον, η seekg() μπορεί να διακινδυνεύσει την αλλαγή ενός αντικειμένου ροής σε περιβάλλον πολλαπλών νημάτων, απαιτώντας προσοχή και την εφαρμογή μηχανισμών συγχρονισμού για τον μετριασμό των πιθανών αλλαγών αντικειμένων 'ofstream'.

Παράδειγμα 1: Βασικά στοιχεία του Seekg()

Στο πρώτο παράδειγμα, θα εξηγήσουμε τα βασικά της συνάρτησης seekg() στη C++. Ο κώδικας ενός προγράμματος C++ δίνεται παρακάτω. Ρίξτε μια ματιά σε αυτό πρώτα και μετά θα προχωρήσουμε στην εξήγηση κάθε ενότητας του κώδικα.



#include

#include

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

ενθ κύριος ( ενθ argc , απανθρακώνω ** argv ) {

fstream sgFile ( 'seekgFile.txt' , ios :: σε | ios :: έξω | ios :: κορμός ) ;

sgFile << 'συνάρτηση seekg()' ;

sgFile. αναζητώ ( 8 , ios :: ικετεύω ) ;

απανθρακώνω sgArray [ 8 ] ;

sgFile. ανάγνωση ( sgArray , 8 ) ;

sgArray [ 8 ] = 0 ;

cout << sgArray << endl ;

sgFile. Κλείσε ( ) ;

}

Το πρόγραμμα περιλαμβάνει δύο απαραίτητα αρχεία κεφαλίδας – και – για χειρισμό αρχείων και λειτουργίες εισόδου/εξόδου, αντίστοιχα. Στη συνέχεια, το 'using namespace std;' περιλαμβάνεται δήλωση, επιτρέποντας τα τυπικά αναγνωριστικά C++ χωρίς να προσδιορίζεται ρητά ο χώρος ονομάτων. Τέλος, ξεκινά η κύρια συνάρτηση, η οποία είναι το σημείο εισόδου του προγράμματος, λαμβάνοντας τα ορίσματα της γραμμής εντολών (argc και argv).

fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Εδώ δημιουργείται το «sgFile», ένα αντικείμενο της κλάσης «fstream», που αντιπροσωπεύει μια ροή αρχείων. Το αρχείο με το όνομα 'seekgFile.txt' σχετίζεται με τη ροή του αρχείου. Η ροή αρχείων ανοίγει για είσοδο (ios::in) έξοδο (ios::out). Εάν το αρχείο υπάρχει, τα περιεχόμενά του περικόπτονται (ios::trunc).

sgFile << 'συνάρτηση seekg()'; – Η συμβολοσειρά “seekg() συνάρτησης” γράφεται στο αρχείο χρησιμοποιώντας τον τελεστή “<<”.

sgFile.seekg(8, ios::beg); – Η συνάρτηση seekg() χρησιμοποιείται για να ορίσετε τον δείκτη λήψης στην 8η θέση από την αρχή (ios::beg) του αρχείου.

sgFile.read(sgArray, 8); – Η συνάρτηση 'read' χρησιμοποιείται για την ανάγνωση οκτώ χαρακτήρων από την τρέχουσα θέση του δείκτη λήψης στο 'sgArray'.

sgArray[8] = 0; – Το Null τερματίζει τον πίνακα χαρακτήρων για να διασφαλίσει τον σωστό χειρισμό συμβολοσειρών.

cout << sgArray << endl; – Το περιεχόμενο του 'sgArray' (οι 8 χαρακτήρες που διαβάζονται από το αρχείο) εμφανίζεται στην κονσόλα χρησιμοποιώντας το cout.

sgFile.close(); – Η συνάρτηση close() χρησιμοποιείται για να κλείσει τη ροή του αρχείου.

Η έξοδος αυτού του προγράμματος αναμένεται να είναι «λειτουργία». Ας το ελέγξουμε στο ακόλουθο απόσπασμα εξόδου:

Ο κώδικας δημιουργεί μια ροή αρχείου που σχετίζεται με το αρχείο 'seekgFile.txt' γράφει μια συμβολοσειρά στο αρχείο, αναζητά την 8η θέση από την αρχή, διαβάζει οκτώ χαρακτήρες και εξάγει το αναγνωσμένο περιεχόμενο. Τέλος, η ροή αρχείων κλείνει.

Παράδειγμα 2: Δυναμική πλοήγηση

Εξετάστε ένα σενάριο όπου πρέπει να υπολογίσετε δυναμικά τη μετατόπιση seekg(). Ας καταλάβουμε πώς να υπολογίσουμε δυναμικά τη μετατόπιση με τη βοήθεια ενός παραδείγματος κώδικα.

#include

#include

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

ενθ κύριος ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

ενθ αντισταθμίζεται = 8 ;

sgFile. αναζητώ ( αντισταθμίζεται , ios :: βάζω ) ;

απανθρακώνω ρυθμιστής [ 8 ] ;

sgFile. ανάγνωση ( ρυθμιστής , 8 ) ;

cout << 'Περιεχόμενο:' << ρυθμιστής << endl ;

sgFile. Κλείσε ( ) ;

ΕΠΙΣΤΡΟΦΗ 0 ;

}

Όπως μπορείτε να δείτε, διαβάζουμε το περιεχόμενο από το ίδιο αρχείο που δημιουργήσαμε στο προηγούμενο παράδειγμα, 'seekgFile.txt'. Η συνάρτηση seekg() θέτει τον δείκτη λήψης στην τρέχουσα θέση (ios::cur) στο αρχείο και μετακινείται κατά την υπολογισμένη μετατόπιση (8 χαρακτήρες). Η συνάρτηση read() διαβάζει οκτώ χαρακτήρες από την τρέχουσα θέση του δείκτη λήψης στο buffer.

Δεδομένου του περιεχομένου του αρχείου 'seekg function' και της μετατόπισης οκτώ χαρακτήρων, το πρόγραμμα θα παράγει την υποσυμβολοσειρά που ξεκινά από τον 9ο χαρακτήρα του αρχείου. Επομένως, το αναμενόμενο αποτέλεσμα του προγράμματος είναι «λειτουργία». Ας το επιβεβαιώσουμε στο παρακάτω δεδομένο έξοδο:

Αυτό το παράδειγμα δείχνει την ευελιξία του seekg() υπολογίζοντας δυναμικά το offset.

Παράδειγμα 3: Πλοήγηση από το τέλος

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

#include

#include

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

ενθ κύριος ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

sgFile. αναζητώ ( - 4 , ios :: τέλος ) ;

απανθρακώνω ρυθμιστής [ 8 ] ;

sgFile. ανάγνωση ( ρυθμιστής , 8 ) ;

cout << 'Περιεχόμενο:' << ρυθμιστής << endl ;

sgFile. Κλείσε ( ) ;

ΕΠΙΣΤΡΟΦΗ 0 ;

}

Αυτό το πρόγραμμα C++ ανοίγει ένα αρχείο με το όνομα 'seekgFile.txt' το οποίο μετακινεί τον δείκτη λήψης τεσσάρων χαρακτήρων προς τα πίσω από το τέλος του αρχείου χρησιμοποιώντας το sgFile.seekg(-4, ios::end), διαβάζει τους επόμενους οκτώ χαρακτήρες από αυτή τη θέση στο ένα buffer και στη συνέχεια εκτυπώνει το περιεχόμενο του buffer στην κονσόλα. Δεδομένου του περιεχομένου του αρχείου ως 'seekg() συνάρτηση', η αναμενόμενη έξοδος είναι 'ction'. Ας αντιστοιχίσουμε την έξοδο στο στιγμιότυπο οθόνης της παρακάτω εξόδου:

συμπέρασμα

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