Syntax a parametre funkcie Seekg() v C++
Seekg() možno implementovať pomocou dvoch syntaxí:
1. Syntax Streampos
Prúd & hľadať ( streampos príspevok ) ;Táto syntax má iba jeden parameter, pozíciu, ktorý predstavuje pozíciu kurzora vo vyrovnávacej pamäti toku. Predstavuje hodnotu „int“ a typu streampos.
2. Syntax odsadenia a smeru
Prúd & hľadať ( prúdiť často , ios_base :: hľadať je špina ) ;Táto syntax má ako vstup dva parametre: offset a smer. Parameter „ofst“ je celé číslo typu streamoff, ktoré označuje posun vo vyrovnávacej pamäti streamu. Parameter „nečistota“ hľadá smer.
- ios_base::beg: Posun od úplného začiatku vyrovnávacej pamäte streamu.
- ios_base::cur: Posun od aktuálnej pozície vo vyrovnávacej pamäti streamu.
- ios_base::end: Posun od poslednej vyrovnávacej pamäte streamu.
Funkcia seekg() v C++ manipuluje s ukazovateľom súboru a umožňuje programátorovi umiestniť ho na konkrétne miesto v súbore. Vráti modifikáciu objektu „istream“ (*this) a podľa toho upraví ukazovateľ súboru.
Spracovanie chýb a výnimiek vo funkcii Seekg() v C++
Funkcia seekg() v C++ zaisťuje základnú záruku spracovania výnimiek, pričom zachováva platnosť objektu, ak sa vyskytne výnimka. Môže vyvolať výnimky „zlyhanie“, keď v príznaku chybového stavu chýbajú informácie a funkcia tieto výnimky zodpovedne zachytí a spravuje, pričom ich vyhodí, ak bol v poslednom volaní nastavený zlý bit.
Okrem toho sa bežný problém s seekg() vyskytuje, keď dosiahne koniec súboru (EOF), čo spôsobí, že ukazovateľ zostane nenastavený a spustí sa chyba. Metóda clear() sa používa na resetovanie ukazovateľa a vyriešenie chýb súvisiacich s EOF. Okrem toho môže seeg() riskovať zmenu objektu streamu vo viacvláknovom prostredí, čo si vyžaduje opatrnosť a implementáciu synchronizačných mechanizmov na zmiernenie potenciálnych zmien objektu „ofstream“.
Príklad 1: Základy Seekg()
V prvom príklade si vysvetlíme základy funkcie seekg() v C++. Kód programu C++ je uvedený nižšie. Najprv si ho pozrite a potom prejdeme k vysvetleniu každej časti kódu.
#include
#include
pomocou menného priestoru std ;
int Hlavná ( int argc , char ** argv ) {
fstream sgFile ( 'seekgFile.txt' , ios :: v | ios :: von | ios :: kmeň ) ;
sgFile << 'funkcia seekg()' ;
sgFile. hľadať ( 8 , ios :: prosiť ) ;
char sgArray [ 8 ] ;
sgFile. čítať ( sgArray , 8 ) ;
sgArray [ 8 ] = 0 ;
cout << sgArray << endl ;
sgFile. Zavrieť ( ) ;
}
Program obsahuje dva potrebné hlavičkové súbory –
fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Tu sa vytvorí „sgFile“, objekt triedy „fstream“, ktorý predstavuje prúd súborov. Súbor s názvom „seekgFile.txt“ je spojený s prúdom súborov. Prúd súboru sa otvorí pre vstup (ios::in) výstup (ios::out). Ak súbor existuje, jeho obsah sa skráti (ios::trunc).
sgFile << “funkcia seekg()”; – Reťazec „seekg() function“ sa zapíše do súboru pomocou operátora „<<“.
sgFile.seekg(8, ios::beg); – Funkcia seekg() sa používa na nastavenie ukazovateľa get na 8. pozíciu od začiatku (ios::beg) súboru.
sgFile.read(sgArray, 8); – Funkcia „read“ sa používa na prečítanie ôsmich znakov z aktuálnej pozície ukazovateľa get do „sgArray“.
sgArray[8] = 0; – Null ukončí pole znakov, aby sa zabezpečilo správne spracovanie reťazca.
cout << sgArray << endl; – Obsah „sgArray“ (8 znakov načítaných zo súboru) sa zobrazí na konzole pomocou cout.
sgFile.close(); – Funkcia close() sa používa na zatvorenie toku súborov.
Očakáva sa, že výstup tohto programu bude „funkcia“. Pozrime sa na to v nasledujúcom výstupnom úryvku:
Kód vytvorí prúd súboru, ktorý je spojený so súborom „seekgFile.txt“, zapíše reťazec do súboru, vyhľadá 8. pozíciu od začiatku, prečíta osem znakov a na výstup vypíše prečítaný obsah. Nakoniec sa tok súborov uzavrie.
Príklad 2: Dynamická navigácia
Zvážte scenár, v ktorom musíte dynamicky vypočítať offset seekg(). Poďme pochopiť, ako dynamicky vypočítať posun pomocou príkladu kódu.
#include#include
pomocou menného priestoru std ;
int Hlavná ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
int offset = 8 ;
sgFile. hľadať ( offset , ios :: dať ) ;
char vyrovnávacej pamäte [ 8 ] ;
sgFile. čítať ( vyrovnávacej pamäte , 8 ) ;
cout << 'Obsah: ' << vyrovnávacej pamäte << endl ;
sgFile. Zavrieť ( ) ;
vrátiť 0 ;
}
Ako vidíte, čítame obsah z rovnakého súboru, ktorý sme vytvorili v predchádzajúcom príklade „seekgFile.txt“. Funkcia seekg() nastaví ukazovateľ get na aktuálnu pozíciu (ios::cur) v súbore a posunie sa o vypočítaný posun (8 znakov). Funkcia read() načíta osem znakov z aktuálnej pozície ukazovateľa get do vyrovnávacej pamäte.
Vzhľadom na obsah súboru „seekg() function“ a posun ôsmich znakov program vypíše podreťazec, ktorý začína 9. znakom súboru. Preto očakávaným výsledkom programu je „funkcia“. Potvrdíme to v nasledujúcom danom výstupe:
Tento príklad demonštruje flexibilitu funkcie seekg() dynamickým výpočtom posunu.
Príklad 3: Navigácia z konca
V tomto príklade si ukážeme, ako čítať dáta v súbore od konca súboru. Tu sa seekg() používa na navigáciu od konca súboru. Záporný posun označuje polohu, ktorá je vzhľadom na koniec. Pozrite si nasledujúci daný kód:
#include#include
pomocou menného priestoru std ;
int Hlavná ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
sgFile. hľadať ( - 4 , ios :: koniec ) ;
char vyrovnávacej pamäte [ 8 ] ;
sgFile. čítať ( vyrovnávacej pamäte , 8 ) ;
cout << 'Obsah: ' << vyrovnávacej pamäte << endl ;
sgFile. Zavrieť ( ) ;
vrátiť 0 ;
}
Tento C++ program otvorí súbor s názvom „seekgFile.txt“, ktorý posunie ukazovateľ get o štyri znaky dozadu od konca súboru pomocou sgFile.seekg(-4, ios::end), načíta ďalších osem znakov z tejto pozície do vyrovnávaciu pamäť a potom vytlačí obsah vyrovnávacej pamäte do konzoly. Vzhľadom na obsah súboru ako funkcia „seekg()“ je očakávaným výstupom „ction“. Porovnajme výstup na snímke obrazovky s nasledujúcim výstupom:
Záver
Stručne povedané, seekg() sa javí ako cenný prínos pre presnú navigáciu v súboroch. Vďaka svojej schopnosti vyhľadávať ľubovoľné pozície, dynamicky vypočítať odchýlky a navigovať z rôznych bodov v súbore umožňuje seekg() vývojárom efektívne zvládnuť operácie so súbormi. Ako sme videli v príkladoch, zvládnutie funkcie seekg() zvyšuje vašu kontrolu a flexibilitu pri práci so súbormi v C++. Vyžaduje si to však starostlivé zváženie spracovania výnimiek a potenciálnych scenárov pretekov s údajmi, aby sa zabezpečili robustné a bezchybné operácie so súbormi v C++.