Różnice między wybraną wersją a wersją aktualną.
strumienie_plikowe_fstream_ifstream_ofstream [2008/12/09 01:11] couto utworzono |
strumienie_plikowe_fstream_ifstream_ofstream [2008/12/09 02:19] (aktualna) couto |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
===== STRUMIENIE PLIKOWE: fstream, ifstream, ofstream ===== | ===== STRUMIENIE PLIKOWE: fstream, ifstream, ofstream ===== | ||
+ | Autor: Mateusz Kołodziejczyk | ||
+ | ---- | ||
Klasa //ifstream// służy do obsługi wejścia plikowego, klasa //ofstream// do obsługi wyjścia plikowego a klasa //fstream// umożliwia jednoczesne operacje wejścia i wyjścia plikowego. Znajdują się w pliku nagłówkowym //fstream// i wywodzą się one z klas zdefiniowanych w pliku nagłówkowym //iostream//, a więc ich obiekty mogą korzystać z metod tych klas. | Klasa //ifstream// służy do obsługi wejścia plikowego, klasa //ofstream// do obsługi wyjścia plikowego a klasa //fstream// umożliwia jednoczesne operacje wejścia i wyjścia plikowego. Znajdują się w pliku nagłówkowym //fstream// i wywodzą się one z klas zdefiniowanych w pliku nagłówkowym //iostream//, a więc ich obiekty mogą korzystać z metod tych klas. | ||
- | ===== Proste operacje wejścia i wyjścia plikowego ===== | + | ==== Proste operacje wejścia i wyjścia plikowego ==== |
- | - Użycie obiektu //ofstream// | + | == Użycie obiektu klasy //ofstream// == |
- | ''ostream fileOut;'' | + | <code c++> |
- | ''fileOut.open("plik.txt");'' | + | ofstream fileOut; |
+ | fileOut.open("plik.txt"); | ||
+ | </code> | ||
+ | lub | ||
+ | <code c++> | ||
+ | ofstream fileOut("plik.txt"); | ||
+ | |||
+ | </code> | ||
+ | Ponieważ klasa //ofstream// jest klasa pochodna //ostream//, możemy używać metod z jej klasy bazowej np: | ||
+ | <code c++> | ||
+ | fileOut << "przykladowe dane"; | ||
+ | fileOut.close(); //zamkniecie strumienia | ||
+ | </code> | ||
+ | == Użycie obiektu klasy //istream// == | ||
+ | <code c++> | ||
+ | ifstream fileIn; | ||
+ | fileIn.open("plik.txt"); | ||
+ | </code> | ||
+ | lub | ||
+ | <code c++> | ||
+ | ifstream fileIn("plik.txt"); | ||
+ | </code> | ||
+ | Ponieważ klasa //ifstream// jest klasa pochodna //istream//, możemy używać metod z jej klasy bazowej np: | ||
+ | <code c++> | ||
+ | string line; | ||
+ | getline(fileIn, line); //wczytanie linii z pliku | ||
+ | fileOut.close(); //zamkniecie strumienia | ||
+ | </code> | ||
+ | |||
+ | ==== Kontrola strumienia plikowego ==== | ||
+ | Aby sprawdzić czy plik został otwarty i czy nie było próby otwarcia pliku z zastosowaniem nieodpowiedniego trybu korzystamy z: | ||
+ | <code c++> | ||
+ | fileIn.open("dane.txt"); | ||
+ | if(!fileIn.is_open()) | ||
+ | { | ||
+ | //plik nie został otwarty | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Tryby otwarcia pliku ==== | ||
+ | W celu określenia trybu możemy wybrać przynajmniej jedna ze stałych zdefiniowanych w klasie //ios_base//. | ||
+ | Konstruktory obiektów powyższych klas i metoda //open()// posiadają jeszcze jeden argument, który określa tryb otwarcia pliku - dla klasy //ofstream// domyślną wartością jest: | ||
+ | <code c++ >ios_base::out | ios_base::trunc</code> a dla klasy //iostream// : <code c++>ios_base::in</code>. Jeśli chodzi o konstruktor klasy //fstream// to nie posiada on domyślnej wartości trybu. | ||
+ | |||
+ | ^Stała ^Znaczenie ^ | ||
+ | ^ ios_base::in | Otwórz plik do odczytu | | ||
+ | ^ ios_base::out | Otwórz plik do zapisu | | ||
+ | ^ ios_base::ate | Po otwarciu pliku ustaw się na jego końcu | | ||
+ | ^ ios_base::app | Dołącz na koniec pliku | | ||
+ | ^ ios_base::trunc | Zredukuj rozmiar pliku do zera, jeśli istnieje | | ||
+ | ^ ios_base::binary | Plik binarny | | ||
+ | |||
+ | Można łączyć tryby za pomoca operatora bitowej aternatywy "|". | ||
+ | Przykład: | ||
+ | <code c++> | ||
+ | ofstream fileOut("dane.txt", ios_base::out | ios_base::app); | ||
+ | </code> | ||
+ | lub | ||
+ | <code c++> | ||
+ | ofstream fileOut; | ||
+ | fileOut.open("dane.txt", ios_base::out | ios_base::app); | ||
+ | </code> | ||
+ | |||
+ | ==== Dostęp swobodny ==== | ||
+ | Dostęp swobodny oznacza możliwość przemieszczania się w dowolne miejsce pliku bez przymusu przesuwania się po kolei po jego zawartości. Służą do tego metody: | ||
+ | * seekg() - przesuwa wskaźnik wejściowy w miejsce podane wewnątrz pliku (możemy korzystać z obiektami klasy //ifstream//) | ||
+ | * seekp() - przesuwa w podane miejsce wewnątrz pliku wskaźnik wyjściowy (możemy korzystać z obiektami klasy //ofstream//) | ||
+ | Obie używamy, gdy mamy do czynienia z obiektami klasy //fstream// | ||
+ | |||
+ | Prototypy seekg(): | ||
+ | <code c++> | ||
+ | istream & seekg(streamoff, ios_base::seekdir); // określenie pozycji w pliku, która jest wyrażona w bajtach jako przesunięcie względem miejsca w pliku określonego przez 2. argument | ||
+ | istream & seekg(streampos); // określenie pozycji w pliku wyrażonej w bajtach względem początku pliku | ||
+ | </code> | ||
+ | |||
+ | Przyklad: | ||
+ | <code c++> | ||
+ | ifstream fileIn("dane.txt"); | ||
+ | fileIn.seekg(10, ios_base::beg); // przesuniecie o 10 bajtów od początku pliku | ||
+ | fileIn.seekg(-10, ios_base::cur); // cofa o 10 bajtów względem aktualnej pozycji | ||
+ | fileIn.seekg(0, ios_base::end); // idź na koniec pliku | ||
+ | fileIn.seekg(80); // umieść wskaźnik na 81 bajcie (pierwszy bajt ma polozenie 0) | ||
+ | </code> | ||
+ | |||
+ | Podobna sytuacja ma miejsce, jeśli chodzi o prototypy metod //seekp()//. | ||
+ | |||
+ | Istnieją również metody, które informują o aktualnym położeniu wskaźników w pliku: | ||
+ | * tellg() - położenie wskaźnika wejściowego w pliku | ||
+ | * tellp() - położenie wskaźnika wyjściowego w pliku | ||
+ | |||
+ | W przypadku klasy //fstream// oba wskaźniki są przesuwane równorzędnie. | ||
+ |