Syntaxe a parametry funkce Seekg() v C++
Seekg() lze implementovat pomocí dvou syntaxí:
1. Syntaxe Streampos
proud & hledat ( příspěvek streampos ) ;Tato syntaxe přebírá pouze jeden parametr, position, který představuje pozici kurzoru ve vyrovnávací paměti proudu. Představuje hodnotu „int“ a typu streampos.
2. Syntaxe offsetu a směru
proud & hledat ( proudit často , ios_base :: hledat je špína ) ;Tato syntaxe má jako vstup dva parametry: offset a směr. Parametr „ofst“ je celé číslo typu streamoff, které označuje posun ve vyrovnávací paměti streamu. Parametr „nečistota“ hledá směr.
- ios_base::beg: Posun od samého začátku vyrovnávací paměti streamu.
- ios_base::cur: Odsazení od aktuální pozice ve vyrovnávací paměti streamu.
- ios_base::end: Posun od poslední vyrovnávací paměti streamu.
Funkce seekg() v C++ manipuluje s ukazatelem souboru a umožňuje programátorovi umístit jej na konkrétní místo v souboru. Vrátí modifikaci objektu „istream“ (*this) a podle toho upraví ukazatel souboru.
Zpracování chyb a výjimek ve funkci Seekg() v jazyce C++
Funkce seekg() v C++ zajišťuje základní záruku pro zpracování výjimek, zachování platnosti objektu, pokud dojde k výjimce. Může vyvolat výjimky „selhání“, když příznak chybového stavu postrádá informace, a funkce tyto výjimky zodpovědně zachytí a spravuje a znovu je vyhodí, pokud byl v posledním volání nastaven špatný bit.
Navíc k běžnému problému se seekg() dochází, když dosáhne konce souboru (EOF), což způsobí, že ukazatel zůstane nenastavený a spustí se chyba. Metoda clear() se používá k resetování ukazatele a vyřešení chyb souvisejících s EOF. Kromě toho může seekg() riskovat změnu objektu streamu v prostředí s více vlákny, což vyžaduje opatrnost a implementaci synchronizačních mechanismů ke zmírnění potenciálních změn objektu „ofstream“.
Příklad 1: Základy Seekg()
V prvním příkladu si vysvětlíme základy funkce seekg() v C++. Kód programu v C++ je uveden níže. Nejprve se na to podívejte a poté přejdeme k vysvětlení každé části kódu.
#include
#include
pomocí jmenného prostoru std ;
int hlavní ( int argc , char ** argv ) {
fstream sgFile ( 'seekgFile.txt' , ios :: v | ios :: ven | ios :: kmen ) ;
sgFile << 'funkce seekg()' ;
sgFile. hledat ( 8 , ios :: žebrat ) ;
char sgArray [ 8 ] ;
sgFile. číst ( sgArray , 8 ) ;
sgArray [ 8 ] = 0 ;
cout << sgArray << endl ;
sgFile. zavřít ( ) ;
}
Program obsahuje dva potřebné hlavičkové soubory –
fstream sgFile(“seekgFile.txt”, ios::in | ios::out | ios::trunk); – Zde se vytvoří „sgFile“, objekt třídy „fstream“, představující souborový proud. Soubor s názvem „seekgFile.txt“ je přidružen k datovému proudu souboru. Tok souboru je otevřen pro vstup (ios::in) výstup (ios::out). Pokud soubor existuje, jeho obsah je zkrácen (ios::trunc).
sgFile << “funkce seekg()”; – Řetězec “seekg() function” je zapsán do souboru pomocí operátoru “<<”.
sgFile.seekg(8, ios::beg); – Funkce seekg() se používá k nastavení ukazatele get na 8. pozici od začátku (ios::beg) souboru.
sgFile.read(sgArray, 8); – Funkce „read“ se používá k načtení osmi znaků z aktuální pozice get pointeru do „sgArray“.
sgArray[8] = 0; – Null ukončí pole znaků, aby bylo zajištěno správné zpracování řetězce.
cout << sgArray << endl; – Obsah „sgArray“ (8 znaků načtených ze souboru) se zobrazí na konzole pomocí cout.
sgFile.close(); – Funkce close() se používá k uzavření toku souborů.
Očekává se, že výstupem tohoto programu bude „funkce“. Pojďme to zkontrolovat v následujícím úryvku výstupu:
Kód vytvoří souborový proud, který je přidružen k souboru „seekgFile.txt“, zapíše do souboru řetězec, vyhledá 8. pozici od začátku, přečte osm znaků a odešle přečtený obsah. Nakonec je datový proud souborů uzavřen.
Příklad 2: Dynamická navigace
Zvažte scénář, kde musíte dynamicky vypočítat offset seekg(). Pojďme pochopit, jak dynamicky vypočítat offset pomocí příkladu kódu.
#include#include
pomocí jmenného prostoru std ;
int hlavní ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
int offset = 8 ;
sgFile. hledat ( offset , ios :: dát ) ;
char vyrovnávací paměť [ 8 ] ;
sgFile. číst ( vyrovnávací paměť , 8 ) ;
cout << 'Obsah: ' << vyrovnávací paměť << endl ;
sgFile. zavřít ( ) ;
vrátit se 0 ;
}
Jak vidíte, čteme obsah ze stejného souboru, který jsme vytvořili v předchozím příkladu, „seekgFile.txt“. Funkce seekg() nastaví ukazatel get na aktuální pozici (ios::cur) v souboru a posune se o vypočítaný offset (8 znaků). Funkce read() načte osm znaků z aktuální pozice ukazatele get do vyrovnávací paměti.
Vzhledem k obsahu souboru „seekg() function“ a offsetu osmi znaků program vypíše podřetězec, který začíná 9. znakem souboru. Očekávaným výsledkem programu je tedy „funkce“. Potvrdíme to v následujícím daném výstupu:
Tento příklad demonstruje flexibilitu seekg() dynamickým výpočtem offsetu.
Příklad 3: Navigace od konce
V tomto příkladu si ukážeme, jak číst data v souboru od konce souboru. Seeg() se zde používá k navigaci od konce souboru. Záporný offset označuje pozici, která je vzhledem ke konci. Viz následující daný kód:
#include#include
pomocí jmenného prostoru std ;
int hlavní ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
sgFile. hledat ( - 4 , ios :: konec ) ;
char vyrovnávací paměť [ 8 ] ;
sgFile. číst ( vyrovnávací paměť , 8 ) ;
cout << 'Obsah: ' << vyrovnávací paměť << endl ;
sgFile. zavřít ( ) ;
vrátit se 0 ;
}
Tento C++ program otevře soubor s názvem „seekgFile.txt“, který přesune ukazatel get o čtyři znaky zpět od konce souboru pomocí sgFile.seekg(-4, ios::end), přečte dalších osm znaků z této pozice do vyrovnávací paměti a poté vytiskne obsah vyrovnávací paměti do konzoly. Vzhledem k obsahu souboru jako funkce „seekg()“ je očekávaným výstupem „ction“. Porovnejme výstup na snímku obrazovky s následujícím výstupem:
Závěr
Stručně řečeno, seekg() se ukazuje jako cenný přínos pro přesné procházení proudů souborů. Díky své schopnosti vyhledávat libovolné pozice, dynamicky počítat offsety a navigovat z různých bodů v souboru, umožňuje seekg() vývojářům efektivně zpracovávat operace se soubory. Jak jsme viděli v příkladech, zvládnutí seekg() zvyšuje vaši kontrolu a flexibilitu při práci se souborovými proudy v C++. Vyžaduje však pečlivé zvážení zpracování výjimek a potenciálních scénářů závodů s daty, aby byly zajištěny robustní a bezchybné operace se soubory v C++.