Otwórz plik
Pierwsza operacja wykonywana na ogół przedmiotem jednej z tych klas jest skojarzyć go do rzeczywistych plików. Procedura ta jest znana jako do otwórz plik. Otwarty plik jest reprezentowany w ramach programu przez obiekt strumienia (instancji jednej z tych klas, w poprzednim przykładzie był to myfile) Oraz wejścia lub wyjścia wykonywanych operacji na tym obiekcie strumienia będą stosowane do fizycznego pliku związanego z nim.
W celu otwarcia pliku z potoku obiektu używamy jej funkcji członka open ():
open (nazwa_pliku, tryb);
Gdzie filename jest NUL sekwencji znaków typu const char * (tego samego rodzaju, literały ciąg mają), co stanowiło nazwę pliku do otwarcia, a Tryb Jest to opcjonalny parametr z kombinacji następujących flag:
ios:: in | Open operacji wejścia. |
---|---|
ios:: out | Otwarte dla wyjścia. |
ios:: binary | Otwarty w trybie binarnym. |
ios:: ate | Ustawianie pozycji wyjściowej na końcu pliku. Jeśli ta flaga nie jest ustawiona na dowolną wartość początkowa pozycja jest na początku pliku. |
ios:: app | Wszystkie operacje wykonywane są wyjścia na końcu pliku, dodanie treści do aktualnej zawartości pliku. Ta flaga może być używany tylko w strumieniach otwarty do wyjścia tylko operacje. |
ios:: TRUNC | Jeżeli plik otwarty dla operacji wyjścia istniały już przed jego poprzedniej zawartości usunięty i zastąpiony nowym. |
Wszystkie te flagi mogą być łączone za pomocą bitowe OR (|). Na przykład, jeśli chcemy, aby otworzyć plik example.bin w trybie binarnym, aby dodać dane możemy zrobić to poprzez następujące wywołanie funkcji członka open ():
1 2 |
ofstream mojplik; myfile.open ("example.bin", Ios:: out | ios:: app | ios:: binary); |
---|
Każdy z open () funkcji członka klasy fstream, ifstream i fstream posiada tryb domyślny, który jest używany, gdy plik jest otwarty bez drugiego argumentu:
Klasa | parametr domyślny tryb |
---|---|
fstream | ios:: out |
ifstream | ios:: in |
fstream | ios:: in | ios:: out |
Dla ifstream i fstream klas, ios:: in i ios:: out są automatycznie i odpowiednio założyć, nawet jeśli w trybie, który nie obejmuje ich jest przekazywana jako drugi argument do open () funkcji członka.
Wartość domyślna jest stosowana, gdy funkcja jest wywoływana bez podania żadnej wartości dla parametru mode. Jeśli funkcja jest wywoływana z jakąkolwiek wartość tego parametru jest trybem domyślnym przeważa, niepołączone.
Strumieni plików otwartych w trybie binarnym wykonywania operacji wejścia i wyjścia, niezależnie od jakichkolwiek względów formacie. Brak plików binarnych są znane jako pliki tekstowe, A niektóre przekłady mogą wystąpić na skutek formatowania, niektórych znaków specjalnych (np. nowa linia i przewozu znaków powrotu).
Ponieważ pierwsze zadanie, które jest wykonywane na obiekt strumienia pliku jest zwykle do otwarcia pliku, te trzy klasy to konstruktor, który automatycznie wzywa open () funkcji członka i ma te same parametry jak tego użytkownika. W związku z tym możemy również zadeklarowały poprzedni myfile obiektu i prowadzone do tej samej operacji otwarcia w poprzednim przykładzie, pisząc:
ofstream myfile ("example.bin", Ios:: out | ios:: app | ios:: binary); |
---|
Połączenie budowy obiektu i otwarcie strumienia w jednej instrukcji. Obie te formy, aby otworzyć plik są ważne i równorzędne.
Aby sprawdzić, czy strumień pliku powiodło się otwarcie pliku, możesz to zrobić, dzwoniąc do Państwa is_open () bez argumentów. Tę funkcję członka zwraca bool wartości true w przypadku, gdy rzeczywiście obiektu Stream jest związane z otwartego pliku, lub FALSE w przeciwnym przypadku:
jeśli (myfile.is_open ()) ( / * Ok, kontynuować wyjścia * / ) |
---|
Kiedy skończysz z naszego wejścia i wyjścia operacji na pliku będziemy blisko tak, że jego zasoby stają się ponownie dostępne. W tym celu, że musimy zadzwonić do strumienia funkcji członka close (). Tę funkcję członka nie ma parametrów, a co robi jest kolor związane zderzaki i zamknij plik:
myfile.close (); |
---|
Po tej funkcji członka nazywa się obiekt strumienia można otworzyć inny plik, a plik jest dostępny ponownie zostaną otwarte przez inny proces.
W przypadku, gdy obiekt jest zniszczone, a jednocześnie związane z otwartego pliku, destruktor automatycznie wywołuje funkcję członka close ().
Strumieniach tekstowych plików są te, w których nie obejmują ios:: binary flagę w trybie otwarcia. Te pliki są przeznaczone do przechowywania tekstu, a zatem wszystkie wartości, które wejście lub wyjście z / do nich może ulegać transformacji niektórych elementów formatowania, które niekoniecznie odpowiadają ich dosłownym wartości binarnej.
Dane wyjściowe operacje na plikach tekstowych są wykonywane w ten sam sposób, w jaki obsługiwane przez sąd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/ / Zapisuje w pliku tekstowym # include <iostream> # include <fstream> za pomocą nazw std; int main () ( ofstream myfile ("example.txt"); jeśli (myfile.is_open ()) ( myfile << "To jest linia. \ N"; myfile << "Jest to kolejny wiersz. \ N"; myfile.close (); ) w przeciwnym razie cout << "Nie można otworzyć pliku"; powrót 0; ) |
[example.txt plik] To jest wiersz. Jest to kolejny wiersz. |
---|
Wprowadzanie danych z pliku może być również wykonana w taki sam sposób, że zrobiliśmy z cin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/ / Odczyt pliku tekstowego # include <iostream> # include <fstream> # include <string> za pomocą nazw std; int main () ( string line; ifstream myfile ("example.txt"); jeśli (myfile.is_open ()) ( podczas gdy (! Myfile.eof ()) ( getline (myfile, line); cout <<linia <<endl; ) myfile.close (); ) w przeciwnym razie cout << "Nie można otworzyć pliku"; powrót 0; ) |
To jest wiersz. Jest to kolejny wiersz. |
---|
Ten ostatni przykład odczytuje plik tekstowy i wyświetla jego treść na ekranie. Zauważ, jak wykorzystaliśmy nową funkcję członka, zwany eof () , która zwraca true w przypadku gdy koniec pliku został osiągnięty. Stworzyliśmy pętli while, że kończy się, gdy rzeczywiście myfile.eof () staje się prawdą (np. koniec pliku został osiągnięty).
Oprócz eof (), Który sprawdza czy na końcu pliku został osiągnięty, a inne funkcje członka istnieją, aby sprawdzić stan strumienia (wszyscy powrót bool value):
bad ()
Zwraca true, jeśli czytania i pisania operacja zakończy się niepowodzeniem. Na przykład w przypadku, gdy staramy się zapisać do pliku, który nie jest otwarty do zapisu lub urządzenia, na którym staramy się pisać nie ma wolnego miejsca.
fail ()
Zwraca true, w tych samych przypadkach jak zła (), ale także w przypadku, gdy format error dzieje, jak wtedy literę ekstrahuje gdy staramy się odczytać liczbę całkowitą.
eof ()
Zwraca true, jeśli plik jest otwarty do odczytu dotarł do końca.
good ()
Jest to najbardziej ogólny bandery: False w tych samych przypadkach, w których dzwonienie do poprzedniej funkcji zwróci true.
Aby zresetować flagi państwowe kontrolowane przez żadną z tych funkcji członka widzieliśmy możemy skorzystać z funkcji członka clear (), Który nie ma parametrów.
All I / O strumieni obiekty, co najmniej jeden wskaźnik wewnętrznego strumienia:
ifstream, Jak istream, Ma wskaźnik znany jako uzyskać wskaźnik , które wskazuje na element, który należy czytać w następnej operacji wejścia.
fstream, Jak ostream, Ma wskaźnik znany jako umieścić wskaźnik , który wskazuje miejsce, w którym obok elementu musi być na piśmie.
Wreszcie, fstream, Dziedziczy zarówno zdobyć i umieścić wskazówki, z iostream (która sama pochodzi z obu istream i ostream).
Te wewnętrzne wskaźniki strumienia, które wskazują na czytanie lub pisanie lokalizacji w strumieniu można manipulować za pomocą następujących funkcji członka:
Te dwie funkcje członka nie ma parametry i zwraca wartość typu państwa pos_type, Co jest liczbą całkowitą typu danych reprezentującego aktualnej pozycji uzyskać wskaźnik strumienia (w przypadku tellg) Lub umieścić wskaźnik strumienia (w przypadku tellp).
Funkcje te pozwalają na zmianę położenia się i umieścić wskazówki strumienia. Obie funkcje są przeciążone z dwóch różnych prototypów. Pierwszy prototyp to:
seekg (stanowiska);
seekp (stanowiska);
Korzystanie z tej prototyp wskaźnik strumienia zmienia się w bezwzględnego stanowiska Stanowisko (licząc od początku pliku). Typu dla tego parametru jest taka sama jak ta zwracana przez funkcje tellg i tellp: Typ państwa pos_type, Co jest liczbą całkowitą.
Inne prototyp tych funkcji to:
seekg (offset, kierunek);
seekp (offset, kierunek);
Korzystanie z tej prototypu stanowiska dostać lub umieścić wskaźnik jest ustawiony na wartość przesunięcia w stosunku do niektórych szczególnych punkt określony przez parametr kierunek. offset jest typu państwa off_type, Który jest również typ Integer. I kierunek jest typu seekdir, Który jest typ wyliczeniowy (enum), Które określa punkt, z którego offset liczony jest od, i że może podjąć jedną z następujących wartości:
ios:: beg | offset liczony od początku strumienia |
---|---|
ios:: cur | offset liczony od bieżącej pozycji wskaźnika strumienia |
ios:: end | offset liczony od końca strumienia |
Poniższy przykład używa funkcji członka widzieliśmy, aby uzyskać rozmiar pliku:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/ / Uzyskanie rozmiar pliku # include <iostream> # include <fstream> za pomocą nazw std; int main () ( długi begin, end; ifstream myfile ("example.txt"); begin = myfile.tellg (); myfile.seekg (0, ios:: end); end = myfile.tellg (); myfile.close (); cout << "rozmiar" <<(End-begin) << "Bajtów. \ N"; powrót 0; ) |
rozmiar: 40 bajtów. |
---|
W plików binarnych do danych wejściowych i wyjściowych z wydobyciem i operatorów wstawiania (<< i >>) I funkcje takie jak getline nie jest skuteczne, ponieważ nie musimy do formatu żadnych danych, a dane nie mogą używać kodów separacji stosowanych przez pliki tekstowe na poszczególne elementy (np. miejsca, nowa linia, itd. ..).
Strumieni plików obejmują dwa państwa funkcje zaprojektowane specjalnie do wejścia i wyjścia binarne dane sekwencyjnie: pisać i czytać. Pierwsza z nich (pisać) Jest funkcją członka ostream dziedziczone przez fstream. I czytać jest funkcją członka istream , który został przejęty przez ifstream. Obiekty klasy fstream mają zarówno członków. Ich prototypy są:
write (memory_block, size);
read (memory_block, size);
Gdzie memory_block jest typu "wskaźnik na znak" (char *), I stanowi adres tablicę bajtów, gdzie dalsze elementy dane są przechowywane lub gdy elementy danych, które są napisane są podejmowane. rozmiar parametr jest liczbą całkowitą wartość, która określa liczbę znaków, należy odczytywać i pisemne z / do bloku pamięci.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/ / Odczyt pliku binarnego pełne # include <iostream> # include <fstream> za pomocą nazw std; ifstream:: pos_type wielkości; char * Memblock; int main () ( ifstream plik ("example.bin", Ios:: in | ios:: binary | ios:: ate); jeśli (file.is_open ()) ( size = file.tellg (); memblock = nowy char [size]; file.seekg (0, ios:: beg); file.read (memblock, size); plik.close (); cout << "całą zawartość pliku w pamięci"; usunąć[] Memblock; ) w przeciwnym razie cout << "Nie można otworzyć pliku"; powrót 0; ) |
całą zawartość pliku w pamięci |
---|
W tym przykładzie całego pliku są odczytywane i zapisywane w bloku pamięci. Przeanalizujmy, jak to osiągnąć:
Po pierwsze, plik jest otwarty z ios:: ate banderą, co oznacza, że się wskaźnik zostanie umieszczony na końcu pliku. W ten sposób, gdy wołamy do Państwa tellg ()Będziemy bezpośrednio uzyskać rozmiar pliku. Wskazówki typu zużyliśmy zadeklarować zmienną rozmiar:
ifstream:: pos_type wielkości; |
---|
ifstream:: pos_type jest szczególnego rodzaju stosowanych do bufora i plików pozycjonowania i typ zwracany przez file.tellg (). Ten typ jest zdefiniowany jako typ integer, dlatego możemy prowadzić na nim takie same działania prowadzimy na jakąkolwiek inną wartość liczby całkowitej, i może być bezpiecznie konwertowane do innego typu integer wystarczająco duży, aby zawierać rozmiar pliku. W pliku o rozmiarze 2GB na podstawie moglibyśmy użyć int:
1 2 |
int wielkości; size = (int) File.tellg (); |
---|
Po uzyskaniu rozmiar pliku, prosimy o alokacji bloku pamięci wystarczająco duże, aby trzymać cały plik:
memblock = nowy char[size]; |
---|
Zaraz po tym, przystępujemy do zestawu uzyskać wskaźnik na początku pliku (należy pamiętać, że otwarty plik ten wskaźnik na końcu), a następnie odczytać cały plik i zamknij go w końcu:
1 2 3 |
file.seekg (0, ios:: beg); file.read (memblock, size); plik.close (); |
---|
W tym momencie możemy współpracować z danych uzyskanych z pliku. Nasz program po prostu informuje, że zawartość pliku jest w pamięci, a następnie kończy pracę.
Gdy posługujemy się strumieni plików, są one związane z wewnętrznego bufora typu streambuf. Bufor ten jest blok pamięci, który działa jako pośrednik między strumieniem i plików fizycznych. Na przykład, fstream, Za każdym razem funkcję członka umieścić (która pisze jeden znak) jest wywoływana, charakter nie są zapisywane bezpośrednio do fizycznego pliku, z którym związany jest strumień. Zamiast tego znaku jest zawarte w tym strumieniu bufor pośrednich.
Gdy bufor jest zaczerwieniona, wszystkie zawarte w niej dane są zapisywane na nośniku fizycznym (jeśli jest to strumień wyjścia) lub po prostu wolny (jeśli jest strumień danych). Proces ten nazywany jest Synchronizacja i odbywa się na podstawie jednego z następujących okoliczności:
Gdy plik zostanie zamknięte: przed zamknięciem pliku wszystkich buforów, które nie zostały jeszcze zaczerwieniona są zsynchronizowane, a wszystkie dane w oczekiwaniu na to pisemną lub przeczytać na nośniku fizycznym.
Gdy bufor jest pełny: Zderzaki posiadają określonej wielkości. Gdy bufor jest pełny to jest automatycznie synchronizowane.
Jawnie, w manipulatory: Przy niektórych manipulatorów są wykorzystywane w strumienie, wyraźne synchronizacja ma miejsce. Te manipulatory są: flush i endl.
Jawnie, z synchronizacją funkcji członka (): Wywołanie funkcji członka strumień sync (), Który nie ma parametrów, powoduje natychmiastowe synchronizacji. Funkcja ta zwraca int wartości równej -1 Jeżeli strumień nie związane buforowych lub w razie awarii. W przeciwnym wypadku (jeśli bufor strumienia został pomyślnie zsynchronizowane) wraca 0.