Odczyt i zapis danych do pliku

2016-05-18 21:42
Jacek Labudda
												

Wstępne wyjaśnienia

Obsługa plików to temat prosty, a jakże istotny. Biblioteka fstream jest podstawową biblioteką służącą do obsługi plików. Daje dostęp do trzech klas: 1. ifstream - pozwala na odczyt z pliku 2. ofstream - pozwala na zapis do pliku 3. fstream - pozwala na zapis/odczyt z/do pliku; Będziemy korzystać z kilku podstawowych funkcji:
void open(nazwa_pliku, tryb);
Funkcja open służy do otwarcia pliku z którym chcemy pracować. Jako pierwszy parametr podajemy nazwę pliku, nazwa pliku(typ const char*). Drugi parametr jest opcjonalny. Określa on tryb pracy pliku(typ ios::openmode): 1. ios::in - plik zostanie otwarty w celu wczytania danych. 2. ios::out - plik zostanie otwarty w celu zapisu danych. 3. ios::binar - plik zostanie otwarty w trybie binarnym. 4. ios::ate - wskaźnik wewnętrzny zostanie ustawiona na końcu pliku. 5. ios::app - po zapisie danych do pliku, jego zawartość zostanie nadpisana na końcu. 6. ios::trunc - po zapisie danych do pliku, jego zawartość zostanie usunięta i zastąpiona nowymi danymi. Tryby można łączyć przy pomocy operatora bitowego |. Dla klasy ifstream standardowym trybem jest ios::in. Dla klasy ofstream standardowym trybem jest ios::out. Dla klasy fstream standardowym trybem jest ios::in | ios::out.
bool is_open();
Funkcja is_open sprawdza, czy dany plik został poprawnie otworzony. Jeśli tak to zwróci true w przeciwnym wypadku, gdy plik nie zostanie odnaleziony funkcja zwróci wartość false.
bool eof();
Funkcja eof sprawdza, czy zakończyliśmy odczytywanie pliku.
void close();
Funkcja zamyka plik.

Zapis danych do pliku

fstream plik; plik.open("plik.txt", ios::out | ios::trunc); plik << "Jakies dane,\n"; plik << "ktore zostana zapisane do pliku."; plik.close();
Po wykonaniu powyższego przykładu, w pliku o nazwie plik.txt zostanie zapisany tekst: Jakies dane, ktore zostana zapisane do pliku.

Odczyt danych z pliku

string pobrane_dane; fstream plik; plik.open("plik.txt", ios::in); if(plik.is_open()){ while(!plik.eof()){ plik >> pobrane_dane; cout << pobrane_dane << " "; } }
wynik: Jakies dane, ktore zostana zapisane do pliku. W powyższym przykładzie - dane z pliku pobierane są wyraz po wyrazie, aż do końca pliku. Można również wczytać dane linia po linii.
string pobrane_dane; fstream plik; plik.open("plik.txt", ios::in); if(plik.is_open()){ while(getline(plik, pobrane_dane)){ cout << pobrane_dane << endl; } }
Bardzo przydatna funkcja getline - pobiera dane z pliku linia po linii. Pierwszym argument funkcji zdefiniowaliśmy obiektem klasy fstream. Zaś drugi argument podaliśmy zmienną, która pobiera wartość z funkcji po przez referencję. Nie ma konieczności używania funkcji open, ponieważ konstruktor klasy definiuje jej dane w taki sam sposób.
fstream plik(nazwa_pliku, tryb);

Dodatkowe funkcje

//seekg(pozycja, zacznij_od); seekg(0, ios::beg); //seekp(pozycja, zacznij_od); seekp(0, ios::beg);
Funkcja seekg oraz seekp- ustawiają pozycję wskaźnika wewnętrznego w określone miejsce. Pierwszym argumentem funkcji jest miejsce przesunięcia wskaźnika(liczba całkowita), zaś drugim jest miejsce od którego jest liczone miejsce przesunięcia wskaźnika. Wartości którymi definiujemy drugi argument: 1. ios::beg - przesunięcie liczone jest od początku pliku 2. ios::end - przesunięcie liczone jest od końca pliku 3. ios::cur - przesunięcie liczone od obecnej pozycji Funkcje różnią się tym, że seekg ustawia wskaźnik wewnętrzny dla funkcji, które wczytują dane z pliku, a seekp ustawia wskaźnik wewnętrzny dla funkcji, które zapisują dane do pliku.
bool good();
Funkcja good zwraca wartość true w momencie, gdy udało się zapisać lub odczytać plik.
bool bad();
Funkcja bad zwraca wartość true w momencie, gdy nie udało się zapisać lub odczytać pliku. Praca z plikami ma wiele zastosowań. Np. możesz zapisywać dane z formularza; zapisać oraz odczytać stan gry; wczytywać modele 3D oraz ich tekstury; oraz wiele innych...

Użytkownicy
Logowanie:
Zaloguj
Polub nas na facebooku
Wyszukiwanie na stronie