Funció C++ Seekg().

Funcio C Seekg



A la programació C++, la funció seekg() proporciona ajuda dins dels fluxos de fitxers. És membre de la biblioteca iostream i el trobareu a la capçalera . Aquesta funció permet als programadors manipular on comença la següent operació d'entrada, agilitzant així el procés de treball amb fitxers. El mètode seekg() us permet saltar a una ubicació específica d'un fitxer que és inestimable quan necessiteu llegir o processar les dades que no estan organitzades seqüencialment. Tant si voleu llegir des del principi, del mig o del final d'un fitxer, seekg() ofereix la flexibilitat necessària per a aquestes tasques. Al llarg d'aquesta guia, aprofundirem en com les funcions seekg() en C++ permeten la recuperació de dades des de diversos punts d'un fitxer.

Sintaxi i paràmetres de la funció Seekg() en C++

Seekg() es pot implementar amb dues sintaxis:

1. Sintaxi de Streampos

corrent & buscarg ( publicació de streampos ) ;

Aquesta sintaxi només pren un paràmetre, la posició, que representa la posició del cursor a la memòria intermèdia de flux. Representa un valor 'int' i de tipus streampos.







2. Sintaxi de desplaçament i direcció

corrent & buscarg ( flueix sovint , ios_base :: buscar és brutícia ) ;

Aquesta sintaxi pren dos paràmetres com a entrada: desplaçament i direcció. El paràmetre 'ofst' és un nombre enter de tipus streamoff que indica el desplaçament a la memòria intermèdia del flux. El paràmetre 'brutícia' busca direcció.



  • ios_base::beg: desplaçament des de l'inici de la memòria intermèdia del flux.
  • ios_base::cur: desplaçament de la posició actual a la memòria intermèdia del flux.
  • ios_base::end: desplaçament de l'últim buffer del flux.

La funció seekg() en C++ manipula el punter del fitxer, permetent al programador posicionar-lo en una ubicació específica dins del fitxer. Retorna la modificació de l'objecte 'istream' (*this) i ajusta el punter del fitxer en conseqüència.



Gestió d'errors i excepcions a la funció Seekg() C++

La funció seekg() en C++ garanteix la garantia bàsica per al maneig d'excepcions, mantenint la validesa de l'objecte si es produeix una excepció. Pot llançar les excepcions de 'error' quan la bandera d'estat d'error no té informació i la funció captura i gestiona aquestes excepcions de manera responsable, tornant-les a llançar si es va establir un bit dolent a l'última trucada.





A més, un problema comú amb seekg() es produeix quan arriba al final del fitxer (EOF), fent que el punter es mantingui sense establir i desencadenant un error. El mètode clear() s'utilitza per restablir el punter i resoldre els errors relacionats amb l'EOF per solucionar-ho. A més, seekg() pot arriscar-se a alterar un objecte de flux en un entorn multiprocés, la qual cosa requereix precaució i la implementació de mecanismes de sincronització per mitigar les possibles alteracions de l'objecte 'ofstream'.

Exemple 1: conceptes bàsics de Seekg()

En el primer exemple, explicarem els fonaments de la funció seekg() en C++. El codi d'un programa C++ es mostra a continuació. Fes-hi una ullada primer i després passarem a l'explicació de cada apartat del codi.



#inclou

#inclou

utilitzant l'espai de noms std ;

int principal ( int argc , char ** argv ) {

fstream sgFile ( 'seekgFile.txt' , ios :: en | ios :: fora | ios :: tronc ) ;

sgFile << 'funció seekg()' ;

sgFile. buscarg ( 8 , ios :: suplicar ) ;

char sgArray [ 8 ] ;

sgFile. llegir ( sgArray , 8 ) ;

sgArray [ 8 ] = 0 ;

cout << sgArray << endl ;

sgFile. Tanca ( ) ;

}

El programa inclou dos fitxers de capçalera necessaris - i - per al maneig de fitxers i les operacions d'entrada/sortida, respectivament. Després, 'using namespace std;' s'inclou la instrucció, que permet els identificadors estàndard de C++ sense especificar l'espai de noms explícitament. Finalment, comença la funció principal, que és el punt d'entrada del programa, prenent els arguments de la línia d'ordres (argc i argv).

fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Aquí, es crea el “sgFile”, un objecte de la classe “fstream”, que representa un flux de fitxers. El fitxer anomenat 'seekgFile.txt' està associat al flux de fitxers. El flux de fitxers s'obre per a la sortida d'entrada (ios::in) (ios::out). Si el fitxer existeix, el seu contingut es trunca (ios::trunc).

sgFile << 'funció seekg()'; – La cadena 'seekg() function' s'escriu al fitxer mitjançant l'operador '<<'.

sgFile.seekg(8, ios::beg); – La funció seekg() s'utilitza per posar el punter d'obtenció a la vuitena posició des del principi (ios::beg) del fitxer.

sgFile.read(sgArray, 8); – La funció 'llegir' s'utilitza per llegir vuit caràcters des de la posició actual del punter d'obtenció al 'sgArray'.

sgArray[8] = 0; – Null finalitza la matriu de caràcters per garantir un tractament adequat de les cadenes.

cout << sgArray << endl; – El contingut de 'sgArray' (els 8 caràcters llegits del fitxer) es mostra a la consola mitjançant cout.

sgFile.close(); – La funció close() s'utilitza per tancar el flux de fitxers.

S'espera que la sortida d'aquest programa sigui 'funció'. Comprovem-ho al fragment de sortida següent:

El codi crea un flux de fitxers associat amb el fitxer 'seekgFile.txt' escriu una cadena al fitxer, cerca la vuitena posició des del principi, llegeix vuit caràcters i emet el contingut llegit. Finalment, el flux d'arxius es tanca.

Exemple 2: navegació dinàmica

Penseu en un escenari en què heu de calcular dinàmicament el desplaçament seekg(). Entendrem com calcular dinàmicament el desplaçament amb l'ajuda d'un exemple de codi.

#inclou

#inclou

utilitzant l'espai de noms std ;

int principal ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

int compensació = 8 ;

sgFile. buscarg ( compensació , ios :: posar ) ;

char tampó [ 8 ] ;

sgFile. llegir ( tampó , 8 ) ;

cout << 'Contingut:' << tampó << endl ;

sgFile. Tanca ( ) ;

tornar 0 ;

}

Com podeu veure, estem llegint el contingut del mateix fitxer que vam crear a l'exemple anterior, 'seekgFile.txt'. La funció seekg() estableix el punter d'obtenció a la posició actual (ios::cur) al fitxer, i es mou pel desplaçament calculat (8 caràcters). La funció read() llegeix vuit caràcters des de la posició actual del punter get al buffer.

Tenint en compte el contingut del fitxer 'seekg() function' i el desplaçament de vuit caràcters, el programa generarà la subcadena que comença a partir del 9è caràcter del fitxer. Per tant, el resultat esperat del programa és 'funció'. Confirmem-ho a la sortida següent:

Aquest exemple demostra la flexibilitat de seekg() calculant dinàmicament el desplaçament.

Exemple 3: navegar des del final

En aquest exemple, demostrarem com llegir les dades d'un fitxer des del final del fitxer. Aquí, seekg() s'utilitza per navegar des del final del fitxer. El desplaçament negatiu indica una posició relativa al final. Vegeu el següent codi donat:

#inclou

#inclou

utilitzant l'espai de noms std ;

int principal ( ) {

ifstream sgFile ( 'seekgFile.txt' ) ;

sgFile. buscarg ( - 4 , ios :: final ) ;

char tampó [ 8 ] ;

sgFile. llegir ( tampó , 8 ) ;

cout << 'Contingut:' << tampó << endl ;

sgFile. Tanca ( ) ;

tornar 0 ;

}

Aquest programa C++ obre un fitxer anomenat 'seekgFile.txt' que mou el punter d'obtenció de quatre caràcters cap enrere des del final del fitxer mitjançant sgFile.seekg(-4, ios::end), llegeix els vuit caràcters següents des d'aquesta posició a una memòria intermèdia i després imprimeix el contingut de la memòria intermèdia a la consola. Donat el contingut del fitxer com a 'funció seekg()', la sortida esperada és 'ction'. Anem a fer coincidir la sortida a la captura de pantalla de la sortida següent:

Conclusió

En resum, seekg() sorgeix com un actiu valuós per navegar pels fluxos de fitxers amb precisió. A través de la seva capacitat per buscar posicions arbitràries, calcular dinàmicament els desplaçaments i navegar des de diferents punts d'un fitxer, seekg() permet als desenvolupadors gestionar les operacions del fitxer de manera eficient. Com hem vist als exemples, el domini de seekg() millora el vostre control i flexibilitat quan treballeu amb fluxos de fitxers en C++. Tanmateix, requereix una consideració acurada del maneig d'excepcions i dels possibles escenaris de cursa de dades per garantir les operacions de fitxers robustes i sense errors en C++.