C++ Seekg()-functie

C Seekg Functie



Bij programmeren in C++ biedt de functie seekg() hulp binnen de bestandsstromen. Het is lid van de iostream-bibliotheek en je vindt het in de -header. Met deze functie kunnen programmeurs manipuleren waar de volgende invoerbewerking begint, waardoor het werkproces met bestanden wordt gestroomlijnd. Met de seekg()-methode kunt u naar een specifieke locatie in een bestand springen, wat van onschatbare waarde is wanneer u gegevens moet lezen of verwerken die niet opeenvolgend zijn georganiseerd. Of u nu vanaf het begin, het midden of het einde van een bestand wilt lezen, seekg() biedt de flexibiliteit die voor dergelijke taken nodig is. In deze handleiding zullen we dieper ingaan op de manier waarop de seekg()-functies in C++ het ophalen van gegevens vanaf verschillende punten in een bestand mogelijk maken.

Syntaxis en parameters van de functie Seekg() in C++

Seekg() kan worden geïmplementeerd met twee syntaxis:

1. Streampos-syntaxis

stroom & zoeken ( streampos-post ) ;

Deze syntaxis gebruikt slechts één parameter, position, die de positie van de cursor in de streambuffer vertegenwoordigt. Het vertegenwoordigt een “int”-waarde en is van het type streampos.







2. Syntaxis van offset en richting

stroom & zoeken ( stroom vaak af , ios_base :: zoeken is aarde ) ;

Deze syntaxis heeft twee parameters als invoer: offset en richting. De parameter “ofst” is een geheel getal van het type streamoff dat de offset in de buffer van de stream aangeeft. De parameter ‘dirt’ zoekt richting.



  • ios_base::beg: Offset vanaf het allereerste begin van de buffer van de stream.
  • ios_base::cur: Offset vanaf de huidige positie in de buffer van de stream.
  • ios_base::end: Offset ten opzichte van de laatste buffer van de stream.

De functie seekg() in C++ manipuleert de bestandsaanwijzer, waardoor de programmeur deze op een specifieke locatie in het bestand kan plaatsen. Het retourneert de wijziging van het “istream”-object (*this) en past de bestandsaanwijzer dienovereenkomstig aan.



Fout- en uitzonderingsafhandeling in de C++ Seekg()-functie

De functie seekg() in C++ zorgt voor de basisgarantie voor de afhandeling van uitzonderingen, waarbij de objectvaliditeit behouden blijft als er een uitzondering optreedt. Het kan de ‘failure’-uitzonderingen genereren wanneer de foutstatusvlag informatie mist, en de functie vangt en beheert deze uitzonderingen op verantwoorde wijze, en gooit ze opnieuw als er bij de laatste aanroep een slecht bit is ingesteld.





Bovendien treedt een veelvoorkomend probleem met seekg() op wanneer het einde van het bestand (EOF) wordt bereikt, waardoor de aanwijzer niet wordt ingesteld en er een fout ontstaat. De clear()-methode wordt gebruikt om de aanwijzer opnieuw in te stellen en de EOF-gerelateerde fouten op te lossen om dit aan te pakken. Bovendien kan seekg() het risico met zich meebrengen dat een stream-object in een multithreaded-omgeving wordt gewijzigd, wat voorzichtigheid en de implementatie van synchronisatiemechanismen noodzakelijk maakt om de potentiële “ofstream”-objectwijzigingen te beperken.

Voorbeeld 1: Basisprincipes van Seekg()

In het eerste voorbeeld leggen we de basisprincipes van de seekg()-functie in C++ uit. De code van een C++-programma wordt hieronder gegeven. Bekijk het eerst en daarna gaan we verder met de uitleg van elke sectie van de code.



#include

#include

namespace std; gebruiken ;

int voornaamst ( int argc , verkoold ** argv ) {

fstream sgBestand ( 'zoekbestand.txt' , ios :: in | ios :: uit | ios :: kofferbak ) ;

sgBestand << 'zoek() functie' ;

sgBestand. zoeken ( 8 , ios :: smeken ) ;

verkoold sgArray [ 8 ] ;

sgBestand. lezen ( sgArray , 8 ) ;

sgArray [ 8 ] = 0 ;

uit << sgArray << eindl ;

sgBestand. dichtbij ( ) ;

}

Het programma bevat twee noodzakelijke headerbestanden – en – voor respectievelijk bestandsverwerking en invoer-/uitvoerbewerkingen. Daarna verschijnt de melding “using namespace std;” -instructie is opgenomen, waardoor de standaard C++-identifiers mogelijk zijn zonder de naamruimte expliciet op te geven. Ten slotte begint de hoofdfunctie, het startpunt van het programma, met de opdrachtregelargumenten (argc en argv).

fstream sgFile(“seekgFile.txt”, ios::in | ios::uit | ios::trunk); – Hier wordt het “sgFile”, een object van de klasse “fstream”, gemaakt, dat een bestandsstroom vertegenwoordigt. Het bestand met de naam “seekgFile.txt” is gekoppeld aan de bestandsstroom. De bestandsstroom wordt geopend voor invoer (ios::in) uitvoer (ios::out). Als het bestand bestaat, wordt de inhoud ervan afgekapt (ios::trunc).

sgFile << “seekg() functie”; – De tekenreeks “seekg() function” wordt naar het bestand geschreven met behulp van de operator “<<”.

sgFile.seekg(8, ios::beg); – De functie seekg() wordt gebruikt om de get-pointer op de 8e positie vanaf het begin (ios::beg) van het bestand te zetten.

sgFile.read(sgArray, 8); – De “read”-functie wordt gebruikt om acht tekens vanaf de huidige positie van de get-pointer in de “sgArray” te lezen.

sgArray[8] = 0; – Null beëindigt de karakterarray om een ​​correcte verwerking van de tekenreeksen te garanderen.

cout << sgArray << endl; – De inhoud van “sgArray” (de 8 tekens die uit het bestand worden gelezen) wordt op de console weergegeven met behulp van cout.

sgFile.close(); – De functie close() wordt gebruikt om de bestandsstroom te sluiten.

De uitvoer van dit programma zal naar verwachting “functie” zijn. Laten we het controleren in het volgende uitvoerfragment:

De code creëert een bestandsstroom die is gekoppeld aan het bestand 'seekgFile.txt', schrijft een tekenreeks naar het bestand, zoekt de 8e positie vanaf het begin, leest acht tekens en voert de gelezen inhoud uit. Ten slotte wordt de bestandsstroom gesloten.

Voorbeeld 2: Dynamische navigatie

Overweeg een scenario waarin u de seekg()-offset dynamisch moet berekenen. Laten we begrijpen hoe we de offset dynamisch kunnen berekenen met behulp van een codevoorbeeld.

#include

#include

namespace std; gebruiken ;

int voornaamst ( ) {

ifstream sgFile ( 'zoekbestand.txt' ) ;

int gecompenseerd = 8 ;

sgBestand. zoeken ( gecompenseerd , ios :: neerzetten ) ;

verkoold buffer [ 8 ] ;

sgBestand. lezen ( buffer , 8 ) ;

uit << 'Inhoud: ' << buffer << eindl ;

sgBestand. dichtbij ( ) ;

opbrengst 0 ;

}

Zoals u kunt zien, lezen we de inhoud uit hetzelfde bestand dat we in het vorige voorbeeld hebben gemaakt, 'seekgFile.txt'. De functie seekg() stelt de get-pointer in op de huidige positie (ios::cur) in het bestand en wordt verplaatst met de berekende offset (8 tekens). De functie read() leest acht tekens vanaf de huidige positie van de get-pointer in de buffer.

Gegeven de inhoud van het “seekg() function”-bestand en de offset van acht tekens, zal het programma de substring uitvoeren die begint vanaf het 9e teken van het bestand. Daarom is het verwachte resultaat van het programma “functie”. Laten we het bevestigen in de volgende gegeven uitvoer:

Dit voorbeeld demonstreert de flexibiliteit van seekg() door de offset dynamisch te berekenen.

Voorbeeld 3: Navigeren vanaf het einde

In dit voorbeeld laten we zien hoe u de gegevens in een bestand vanaf het einde van het bestand kunt lezen. Hier wordt seekg() gebruikt om vanaf het einde van het bestand te navigeren. De negatieve offset geeft een positie aan die relatief is ten opzichte van het einde. Zie de volgende gegeven code:

#include

#include

namespace std; gebruiken ;

int voornaamst ( ) {

ifstream sgFile ( 'zoekbestand.txt' ) ;

sgBestand. zoeken ( - 4 , ios :: einde ) ;

verkoold buffer [ 8 ] ;

sgBestand. lezen ( buffer , 8 ) ;

uit << 'Inhoud: ' << buffer << eindl ;

sgBestand. dichtbij ( ) ;

opbrengst 0 ;

}

Dit C++-programma opent een bestand met de naam “seekgFile.txt” dat de get-pointer van vier tekens naar achteren verplaatst vanaf het einde van het bestand met behulp van sgFile.seekg(-4, ios::end), leest de volgende acht tekens vanaf die positie in een buffer en drukt vervolgens de inhoud van de buffer af naar de console. Gegeven de inhoud van het bestand als “seekg()-functie”, is de verwachte uitvoer “ction”. Laten we de uitvoer matchen in de schermafbeelding van de volgende uitvoer:

Conclusie

Samenvattend komt seekg() naar voren als een waardevol hulpmiddel voor het nauwkeurig navigeren door de bestandsstromen. Door de mogelijkheid om willekeurige posities te zoeken, de offsets dynamisch te berekenen en vanaf verschillende punten binnen een bestand te navigeren, stelt seek() de ontwikkelaars in staat de bestandsbewerkingen efficiënt af te handelen. Zoals we in de voorbeelden hebben gezien, vergroot het beheersen van seekg() uw controle en flexibiliteit bij het werken met bestandsstromen in C++. Het vereist echter een zorgvuldige afweging van de afhandeling van uitzonderingen en mogelijke datarace-scenario's om robuuste en foutloze bestandsbewerkingen in C++ te garanderen.