Funzione Seekg() di C++

Funzione Seekg Di C



Nella programmazione C++, la funzione seeg() fornisce aiuto all'interno dei flussi di file. È un membro della libreria iostream e lo troverai nell'intestazione . Questa funzione consente ai programmatori di manipolare il punto in cui inizia la successiva operazione di input, semplificando così il processo di lavoro con i file. Il metodo seeg() ti consente di passare a una posizione specifica in un file, il che è prezioso quando devi leggere o elaborare i dati che non sono organizzati in sequenza. Sia che tu miri a leggere dall'inizio, dalla metà o dalla fine di un file, seeg() fornisce la flessibilità necessaria per tali attività. In questa guida approfondiremo il modo in cui le funzioni seeg() in C++ consentono il recupero dei dati da vari punti all'interno di un file.

Sintassi e parametri della funzione Seekg() in C++

Seekg() può essere implementato con due sintassi:

1. Sintassi Streampos

flusso & cerc ( post di streampos ) ;

Questa sintassi accetta solo un parametro, position, che rappresenta la posizione del cursore nel buffer del flusso. Rappresenta un valore “int” e di tipo streampos.







2. Sintassi di offset e direzione

flusso & cerc ( eseguire lo streaming spesso , ios_base :: cercare è sporco ) ;

Questa sintassi accetta due parametri come input: offset e direzione. Il parametro “ofst” è un numero intero di tipo streamoff che indica l’offset nel buffer dello stream. Il parametro “sporco” cerca la direzione.



  • ios_base::beg: offset dall'inizio del buffer dello stream.
  • ios_base::cur: offset dalla posizione corrente nel buffer dello stream.
  • ios_base::end: offset dall'ultimo buffer dello stream.

La funzione seeg() in C++ manipola il puntatore del file, consentendo al programmatore di posizionarlo in una posizione specifica all'interno del file. Restituisce la modifica dell'oggetto “istream” (*this) e regola di conseguenza il puntatore del file.



Gestione degli errori e delle eccezioni nella funzione Seekg() di C++

La funzione seeg() in C++ garantisce la garanzia di base per la gestione delle eccezioni, mantenendo la validità dell'oggetto se si verifica un'eccezione. Potrebbe generare eccezioni di 'fallimento' quando il flag di stato di errore manca di informazioni e la funzione rileva e gestisce responsabilmente queste eccezioni, rilanciandole se nell'ultima chiamata è stato impostato un bit errato.





Inoltre, un problema comune con seeg() si verifica quando raggiunge la fine del file (EOF), facendo sì che il puntatore rimanga non impostato e attivando un errore. Il metodo clear() viene utilizzato per reimpostare il puntatore e risolvere gli errori relativi a EOF per risolvere questo problema. Inoltre, seeg() potrebbe rischiare di alterare un oggetto stream in un ambiente multithread, richiedendo cautela e l'implementazione di meccanismi di sincronizzazione per mitigare le potenziali alterazioni dell'oggetto “ofstream”.

Esempio 1: nozioni di base su Seekg()

Nel primo esempio spiegheremo le basi della funzione seeg() in C++. Il codice di un programma C++ è riportato di seguito. Dategli prima un'occhiata e poi passeremo alla spiegazione di ogni sezione del codice.



#include

#include

utilizzando lo spazio dei nomi std ;

int principale ( int argc , car ** argv ) {

fstream sgFile ( 'seekgFile.txt' , ios :: In | ios :: fuori | ios :: tronco ) ;

sgFile << 'funzione seekg()' ;

sgFile. cerc ( 8 , ios :: elemosinare ) ;

car sgArray [ 8 ] ;

sgFile. Leggere ( sgArray , 8 ) ;

sgArray [ 8 ] = 0 ;

cout << sgArray << fine ;

sgFile. vicino ( ) ;

}

Il programma include due file header necessari – e – rispettivamente per la gestione dei file e le operazioni di input/output. Successivamente, il messaggio 'using namespace std;' è inclusa l'istruzione, consentendo gli identificatori C++ standard senza specificare esplicitamente lo spazio dei nomi. Infine inizia la funzione main, che è il punto di ingresso del programma, accettando gli argomenti della riga di comando (argc e argv).

fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Qui viene creato lo “sgFile”, un oggetto della classe “fstream”, che rappresenta un flusso di file. Il file denominato 'seekgFile.txt' è associato al flusso di file. Il flusso di file viene aperto per l'input (ios::in) e l'output (ios::out). Se il file esiste, il suo contenuto viene troncato (ios::trunc).

sgFile << “funzione seekg()”; – La stringa “seekg() function” viene scritta nel file utilizzando l'operatore “<<”.

sgFile.seekg(8, ios::beg); – La funzione seeg() viene utilizzata per impostare il puntatore get all'ottava posizione dall'inizio (ios::beg) del file.

sgFile.read(sgArray, 8); – La funzione “read” viene utilizzata per leggere otto caratteri dalla posizione corrente del puntatore get nello “sgArray”.

sgArray[8] = 0; – Null termina l'array di caratteri per garantire una corretta gestione delle stringhe.

cout << sgArray << endl; – Il contenuto di 'sgArray' (gli 8 caratteri letti dal file) viene visualizzato sulla console utilizzando cout.

sgFile.close(); – La funzione close() viene utilizzata per chiudere il flusso di file.

Si prevede che l'output di questo programma sia 'funzione'. Controlliamolo nel seguente frammento di output:

Il codice crea un flusso di file associato al file 'seekgFile.txt', scrive una stringa nel file, cerca l'ottava posizione dall'inizio, legge otto caratteri e restituisce il contenuto letto. Infine, il flusso di file viene chiuso.

Esempio 2: navigazione dinamica

Considera uno scenario in cui devi calcolare dinamicamente l'offset seeg(). Cerchiamo di capire come calcolare dinamicamente l'offset con l'aiuto di un esempio di codice.

#include

#include

utilizzando lo spazio dei nomi std ;

int principale ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

int compensare = 8 ;

sgFile. cerc ( compensare , ios :: Mettere ) ;

car respingente [ 8 ] ;

sgFile. Leggere ( respingente , 8 ) ;

cout << 'Contenuto: ' << respingente << fine ;

sgFile. vicino ( ) ;

ritorno 0 ;

}

Come puoi vedere, stiamo leggendo il contenuto dello stesso file che abbiamo creato nell'esempio precedente, 'seekgFile.txt'. La funzione seeg() imposta il puntatore get nella posizione corrente (ios::cur) nel file e viene spostato in base all'offset calcolato (8 caratteri). La funzione read() legge otto caratteri dalla posizione corrente del puntatore get nel buffer.

Dato il contenuto del file “funzione seekg()” e l'offset di otto caratteri, il programma produrrà la sottostringa che inizia dal 9° carattere del file. Pertanto, il risultato atteso del programma è “funzione”. Confermiamolo nel seguente output:

Questo esempio dimostra la flessibilità di seeg() calcolando dinamicamente l'offset.

Esempio 3: navigazione dalla fine

In questo esempio, dimostreremo come leggere i dati in un file dalla fine del file. Qui, searchg() viene utilizzato per navigare dalla fine del file. L'offset negativo indica una posizione relativa alla fine. Vedere il seguente codice indicato:

#include

#include

utilizzando lo spazio dei nomi std ;

int principale ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

sgFile. cerc ( - 4 , ios :: FINE ) ;

car respingente [ 8 ] ;

sgFile. Leggere ( respingente , 8 ) ;

cout << 'Contenuto: ' << respingente << fine ;

sgFile. vicino ( ) ;

ritorno 0 ;

}

Questo programma C++ apre un file denominato 'seekgFile.txt' che sposta il puntatore get di quattro caratteri indietro dalla fine del file utilizzando sgFile.seekg(-4, ios::end), legge i successivi otto caratteri da quella posizione in un buffer, quindi stampa il contenuto del buffer sulla console. Dato il contenuto del file come “funzione seekg()”, l'output previsto è “ction”. Abbiniamo l'output nello screenshot del seguente output:

Conclusione

In sintesi, seeg() emerge come una risorsa preziosa per navigare con precisione nei flussi di file. Attraverso la sua capacità di cercare posizioni arbitrarie, calcolare dinamicamente gli offset e navigare da diversi punti all'interno di un file, seeg() consente agli sviluppatori di gestire le operazioni sui file in modo efficiente. Come abbiamo visto negli esempi, padroneggiare seeg() migliora il controllo e la flessibilità quando si lavora con flussi di file in C++. Tuttavia, richiede un'attenta considerazione della gestione delle eccezioni e dei potenziali scenari di corsa dei dati per garantire operazioni sui file robuste e prive di errori in C++.