===== 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. ==== Proste operacje wejścia i wyjścia plikowego ==== == Użycie obiektu klasy //ofstream// == ofstream fileOut; fileOut.open("plik.txt"); lub ofstream fileOut("plik.txt"); Ponieważ klasa //ofstream// jest klasa pochodna //ostream//, możemy używać metod z jej klasy bazowej np: fileOut << "przykladowe dane"; fileOut.close(); //zamkniecie strumienia == Użycie obiektu klasy //istream// == ifstream fileIn; fileIn.open("plik.txt"); lub ifstream fileIn("plik.txt"); Ponieważ klasa //ifstream// jest klasa pochodna //istream//, możemy używać metod z jej klasy bazowej np: string line; getline(fileIn, line); //wczytanie linii z pliku fileOut.close(); //zamkniecie strumienia ==== Kontrola strumienia plikowego ==== Aby sprawdzić czy plik został otwarty i czy nie było próby otwarcia pliku z zastosowaniem nieodpowiedniego trybu korzystamy z: fileIn.open("dane.txt"); if(!fileIn.is_open()) { //plik nie został otwarty } ==== 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: ios_base::out | ios_base::trunc a dla klasy //iostream// : ios_base::in. 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: ofstream fileOut("dane.txt", ios_base::out | ios_base::app); lub ofstream fileOut; fileOut.open("dane.txt", ios_base::out | ios_base::app); ==== 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(): 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 Przyklad: 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) 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.