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.
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
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
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 }
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 oznacza możliwość przemieszczania się w dowolne miejsce pliku bez przymusu przesuwania się po kolei po jego zawartości. Służą do tego metody:
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:
W przypadku klasy fstream oba wskaźniki są przesuwane równorzędnie.