===== 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.