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 –
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.