Syntaks og parametre for funktionen Seekg() i C++
Seekg() kan implementeres med to syntakser:
1. Streampos Syntaks
strøm & søg kg ( streampos indlæg ) ;Denne syntaks tager kun én parameter, position, som repræsenterer markørens position i streambufferen. Det repræsenterer en 'int'-værdi og af typen streampos.
2. Offset og retningssyntaks
strøm & søg kg ( strømme af ofte , ios_base :: søge er smuds ) ;Denne syntaks tager to parametre som input: offset og retning. Parameteren 'ofst' er et heltal af typen streamoff, der angiver offset i streamens buffer. Parameteren 'snavs' søger retning.
- ios_base::beg: Forskudt fra starten af streamens buffer.
- ios_base::cur: Forskudt fra den aktuelle position i strømmens buffer.
- ios_base::end: Offset fra den sidste af streamens buffer.
Seekg()-funktionen i C++ manipulerer filmarkøren, hvilket gør det muligt for programmøren at placere den på et bestemt sted i filen. Det returnerer modifikationen af 'istream'-objektet (*dette) og justerer filmarkøren i overensstemmelse hermed.
Fejl- og undtagelseshåndtering i C++ Seekg()-funktionen
Seekg()-funktionen i C++ sikrer den grundlæggende garanti for undtagelseshåndtering, idet objektets gyldighed opretholdes, hvis der opstår en undtagelse. Det kan kaste 'fejl'-undtagelserne, når fejltilstandsflaget mangler information, og funktionen fanger og administrerer disse undtagelser på en ansvarlig måde, og gengiver dem, hvis der blev sat en dårlig bit i det sidste kald.
Desuden opstår et almindeligt problem med seekg() når den når filens ende (EOF), hvilket får markøren til at forblive deaktiveret og udløser en fejl. Clear()-metoden bruges til at nulstille markøren og løse de EOF-relaterede fejl for at løse dette. Derudover kan seekg() risikere at ændre et stream-objekt i et multithreaded-miljø, hvilket nødvendiggør forsigtighed og implementering af synkroniseringsmekanismer for at afbøde de potentielle 'ofstream'-objektændringer.
Eksempel 1: Grundlæggende om Seekg()
I det første eksempel vil vi forklare det grundlæggende i funktionen seekg() i C++. Koden for et C++-program er angivet i det følgende. Tag et kig på det først, og så vil vi gå videre til forklaringen af hver del af koden.
#include
#include
bruger navneområde std ;
int vigtigste ( int argc , char ** argv ) {
fstream sgFile ( 'seekgFile.txt' , ios :: i | ios :: ud | ios :: bagagerum ) ;
sgFile << 'sekg() funktion' ;
sgFile. søg kg ( 8 , ios :: tigge ) ;
char sgArray [ 8 ] ;
sgFile. Læs ( sgArray , 8 ) ;
sgArray [ 8 ] = 0 ;
cout << sgArray << endl ;
sgFile. tæt ( ) ;
}
Programmet inkluderer to nødvendige header-filer –
fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Her oprettes 'sgFile', et objekt af klassen 'fstream', som repræsenterer en filstrøm. Filen med navnet 'seekgFile.txt' er knyttet til filstrømmen. Filstrømmen åbnes for input (ios::in) output (ios::out). Hvis filen eksisterer, afkortes dens indhold (ios::trunc).
sgFile << 'seekg() funktion'; – Strengen 'seekg() funktion' skrives til filen ved hjælp af operatoren '<<'.
sgFile.seekg(8, ios::beg); – Seekg()-funktionen bruges til at sætte get-markøren til den 8. position fra begyndelsen (ios::beg) af filen.
sgFile.read(sgArray, 8); – 'Læs'-funktionen bruges til at læse otte tegn fra den aktuelle position af get-markøren ind i 'sgArray'.
sgArray[8] = 0; – Null afslutter tegnarrayet for at sikre en korrekt strenghåndtering.
cout << sgArray << endl; – Indholdet af 'sgArray' (de 8 tegn læst fra filen) vises på konsollen ved hjælp af cout.
sgFile.close(); – Funktionen close() bruges til at lukke filstrømmen.
Outputtet af dette program forventes at være 'funktion'. Lad os tjekke det i følgende output-snippet:
Koden opretter en filstrøm, der er knyttet til filen 'seekgFile.txt', skriver en streng til filen, søger den 8. position fra begyndelsen, læser otte tegn og udlæser det læste indhold. Til sidst lukkes filstrømmen.
Eksempel 2: Dynamisk navigation
Overvej et scenario, hvor du dynamisk skal beregne seekg() offset. Lad os forstå, hvordan man dynamisk beregner offset ved hjælp af et kodeeksempel.
#include#include
bruger navneområde std ;
int vigtigste ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
int offset = 8 ;
sgFile. søg kg ( offset , ios :: sætte ) ;
char buffer [ 8 ] ;
sgFile. Læs ( buffer , 8 ) ;
cout << 'Indhold: ' << buffer << endl ;
sgFile. tæt ( ) ;
Vend tilbage 0 ;
}
Som du kan se, læser vi indholdet fra den samme fil, som vi oprettede i det foregående eksempel, 'seekgFile.txt'. Seekg()-funktionen sætter get-markøren til den aktuelle position (ios::cur) i filen, og den flyttes af den beregnede offset (8 tegn). Read()-funktionen læser otte tegn fra den aktuelle position af get-markøren ind i bufferen.
Givet indholdet af 'seekg() function'-filen og forskydningen på otte tegn, vil programmet udlæse den understreng, der starter fra det 9. tegn i filen. Derfor er det forventede resultat af programmet 'funktion'. Lad os bekræfte det i følgende givne output:
Dette eksempel demonstrerer fleksibiliteten af seekg() ved dynamisk at beregne offset.
Eksempel 3: Navigering fra slutningen
I dette eksempel vil vi demonstrere, hvordan man læser dataene i en fil fra slutningen af filen. Her bruges seekg() til at navigere fra slutningen af filen. Den negative offset angiver en position, der er i forhold til enden. Se følgende givne kode:
#include#include
bruger navneområde std ;
int vigtigste ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
sgFile. søg kg ( - 4 , ios :: ende ) ;
char buffer [ 8 ] ;
sgFile. Læs ( buffer , 8 ) ;
cout << 'Indhold: ' << buffer << endl ;
sgFile. tæt ( ) ;
Vend tilbage 0 ;
}
Dette C++-program åbner en fil med navnet 'seekgFile.txt', som flytter get-markøren på fire tegn bagud fra slutningen af filen ved hjælp af sgFile.seekg(-4, ios::end), læser de næste otte tegn fra den position til en buffer, og udskriver derefter indholdet af bufferen til konsollen. Givet indholdet af filen som 'seekg() funktion', er det forventede output 'ction'. Lad os matche outputtet i skærmbilledet af følgende output:
Konklusion
Sammenfattende fremstår seekg() som et værdifuldt aktiv til at navigere i filstrømmene med præcision. Gennem sin evne til at søge vilkårlige positioner, dynamisk beregne forskydninger og navigere fra forskellige punkter i en fil, giver seekg() udviklerne mulighed for at håndtere filoperationerne effektivt. Som vi har set i eksemplerne, forbedrer mastering af seekg() din kontrol og fleksibilitet, når du arbejder med filstrømme i C++. Det kræver dog en nøje overvejelse af undtagelseshåndtering og potentielle datarace-scenarier for at sikre robuste og fejlfri filoperationer i C++.