Sintaksa i parametri funkcije Seekg() u C++
Seekg() se može implementirati s dvije sintakse:
1. Streampos sintaksa
potok i tražiti ( streampos post ) ;Ova sintaksa uzima samo jedan parametar, poziciju, koja predstavlja poziciju kursora u međuspremniku toka. Predstavlja 'int' vrijednost i tipa streampos.
2. Sintaksa odmaka i smjera
potok i tražiti ( strujati često , ios_baza :: tražiti je prljavština ) ;Ova sintaksa uzima dva parametra kao ulaz: pomak i smjer. Parametar 'ofst' je cijeli broj tipa streamoff koji označava pomak u međuspremniku toka. Parametar 'prljavštine' traži smjer.
- ios_base::beg: Pomak od samog početka međuspremnika streama.
- ios_base::cur: Pomak od trenutne pozicije u međuspremniku streama.
- ios_base::end: Pomak od posljednjeg međuspremnika toka.
Funkcija seekg() u C++ manipulira pokazivačem datoteke, omogućujući programeru da ga postavi na određeno mjesto unutar datoteke. Vraća modifikaciju 'istream' objekta (*this) i prema tome prilagođava pokazivač datoteke.
Rukovanje pogreškama i iznimkama u funkciji C++ Seekg().
Funkcija seekg() u C++ osigurava osnovno jamstvo za rukovanje iznimkama, održavajući valjanost objekta ako se iznimka dogodi. Može izbaciti iznimke 'neuspjeha' kada oznaka stanja pogreške nema informacije, a funkcija odgovorno hvata te iznimke i upravlja njima, ponovno ih izbacujući ako je u zadnjem pozivu postavljen loš bit.
Štoviše, čest problem sa seekg() javlja se kada dođe do kraja datoteke (EOF), uzrokujući da pokazivač ostane nepostavljen i pokreće pogrešku. Metoda clear() koristi se za resetiranje pokazivača i rješavanje pogrešaka povezanih s EOF-om kako bi se to riješilo. Dodatno, seekg() može dovesti do rizika mijenjanja objekta toka u višenitnom okruženju, što zahtijeva oprez i implementaciju mehanizama sinkronizacije za ublažavanje potencijalnih izmjena objekta 'ofstream'.
Primjer 1: Osnove Seekg()
U prvom primjeru objasnit ćemo osnove funkcije seekg() u C++. Kôd C++ programa je dan u nastavku. Prvo ga pogledajte, a zatim ćemo prijeći na objašnjenje svakog dijela koda.
#include
#include
koristeći prostor imena std ;
int glavni ( int argc , char ** argv ) {
fstream sgFile ( 'seekFile.txt' , ios :: u | ios :: van | ios :: deblo ) ;
sgFile << 'seekg() funkcija' ;
sgFile. tražiti ( 8 , ios :: moliti ) ;
char sgArray [ 8 ] ;
sgFile. čitati ( sgArray , 8 ) ;
sgArray [ 8 ] = 0 ;
cout << sgArray << endl ;
sgFile. Zatvoriti ( ) ;
}
Program uključuje dvije potrebne datoteke zaglavlja –
fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Ovdje se stvara “sgFile”, objekt klase “fstream”, koji predstavlja tok datoteke. Datoteka pod nazivom “seekgFile.txt” povezana je s tokom datoteka. Tok datoteke je otvoren za ulaz (ios::in) izlaz (ios::out). Ako datoteka postoji, njen sadržaj je skraćen (ios::trunc).
sgFile << “seekg() funkcija”; – Niz funkcije “seekg()” zapisuje se u datoteku pomoću operatora “<<”.
sgFile.seekg(8, ios::beg); – Funkcija seekg() koristi se za postavljanje pokazivača get na 8. mjesto od početka (ios::beg) datoteke.
sgFile.read(sgArray, 8); – Funkcija 'read' koristi se za čitanje osam znakova iz trenutne pozicije pokazivača get u 'sgArray'.
sgArray[8] = 0; – Null prekida niz znakova kako bi se osiguralo pravilno rukovanje nizom.
cout << sgArray << endl; – Sadržaj 'sgArray' (8 znakova pročitanih iz datoteke) prikazuje se na konzoli koristeći cout.
sgFile.close(); – Funkcija close() koristi se za zatvaranje toka datoteke.
Očekuje se da će izlaz ovog programa biti 'funkcija'. Provjerimo to u sljedećem izlaznom isječku:
Kod stvara tok datoteke koji je pridružen datoteci 'seekgFile.txt', upisuje niz u datoteku, traži osmo mjesto od početka, čita osam znakova i ispisuje pročitani sadržaj. Konačno, tok datoteke je zatvoren.
Primjer 2: Dinamička navigacija
Razmotrite scenarij u kojem morate dinamički izračunati pomak seekg(). Razmotrimo kako dinamički izračunati pomak uz pomoć primjera koda.
#include#include
koristeći prostor imena std ;
int glavni ( ) {
ifstream sgFile ( 'seekFile.txt' ) ;
int pomaknuti = 8 ;
sgFile. tražiti ( pomaknuti , ios :: staviti ) ;
char pufer [ 8 ] ;
sgFile. čitati ( pufer , 8 ) ;
cout << 'Sadržaj: ' << pufer << endl ;
sgFile. Zatvoriti ( ) ;
povratak 0 ;
}
Kao što vidite, čitamo sadržaj iz iste datoteke koju smo stvorili u prethodnom primjeru, 'seekgFile.txt'. Funkcija seekg() postavlja pokazivač get na trenutnu poziciju (ios::cur) u datoteci i pomiče se za izračunati pomak (8 znakova). Funkcija read() čita osam znakova s trenutne pozicije pokazivača get u međuspremnik.
S obzirom na sadržaj datoteke “seekg() function” i pomak od osam znakova, program će ispisati podniz koji počinje od 9. znaka datoteke. Stoga je očekivani rezultat programa 'funkcija'. Potvrdimo to u sljedećem danom izlazu:
Ovaj primjer pokazuje fleksibilnost seekg() dinamičkim izračunavanjem pomaka.
Primjer 3: Navigacija od kraja
U ovom primjeru pokazat ćemo kako čitati podatke u datoteci s kraja datoteke. Ovdje se seekg() koristi za navigaciju od kraja datoteke. Negativni pomak označava položaj koji je relativan u odnosu na kraj. Pogledajte sljedeći navedeni kod:
#include#include
koristeći prostor imena std ;
int glavni ( ) {
ifstream sgFile ( 'seekFile.txt' ) ;
sgFile. tražiti ( - 4 , ios :: kraj ) ;
char pufer [ 8 ] ;
sgFile. čitati ( pufer , 8 ) ;
cout << 'Sadržaj: ' << pufer << endl ;
sgFile. Zatvoriti ( ) ;
povratak 0 ;
}
Ovaj C++ program otvara datoteku pod nazivom 'seekgFile.txt' koja pomiče pokazivač za dobivanje četiri znaka unatrag od kraja datoteke pomoću sgFile.seekg(-4, ios::end), čita sljedećih osam znakova s te pozicije u međuspremnik, a zatim ispisuje sadržaj međuspremnika na konzolu. S obzirom na sadržaj datoteke kao 'seekg() funkcija', očekivani izlaz je 'ction'. Usporedimo izlaz na snimci zaslona sljedećeg izlaza:
Zaključak
Ukratko, seekg() se pojavljuje kao dragocjeno sredstvo za precizno kretanje kroz tokove datoteka. Svojom sposobnošću traženja proizvoljnih pozicija, dinamičkog izračunavanja pomaka i kretanja s različitih točaka unutar datoteke, seekg() omogućuje programerima da učinkovito rukuju operacijama datoteke. Kao što smo vidjeli u primjerima, ovladavanje seekg() poboljšava vašu kontrolu i fleksibilnost pri radu s tokovima datoteka u C++. Međutim, zahtijeva pažljivo razmatranje rukovanja iznimkama i mogućih scenarija utrke podataka kako bi se osigurale robusne operacije datoteka bez grešaka u C++-u.