Jak używać fstream C ++

Jak używać fstream C ++
fstream Termin oznacza strumień plików. Strumień odnosi się do sekwencji znaków przechodzących z dysku do programu C ++ lub z programu C+ do dysku. Wprowadza się do wprowadzania znaków z pliku na dysku do programu. Przenieś znaki z programu do pliku na dysku wyprowadza. W skrócie plik wejściowego, tak jak ifstream jest ustrukturyzowany przez klasę szablonu, basic_ifstream. W skrócie plik wyjściowego, Ofstream jest ustrukturyzowany przez klasę szablonu, Basic_OfStream.

Możliwe jest wprowadzenie i wyprowadzanie w jednej sesji. Jest to możliwe dzięki szablonowi klasy, Basic_fstream. Teraz fstream jest synonimem Basic_Fstream. fstream, który jest nadal podstawowy_fstream, używa do obsługi Basic_ifstream i Ofstream.

Aby wykonać dane wejściowe, wykonaj dane wyjściowe lub obie w jednej sesji, wystarczy uruchomić program C ++ z następującymi zawiera i inwokacje przestrzeni nazw:

#włączać
#włączać
za pomocą przestrzeni nazw Std;

Ten samouczek zawiera cztery główne sekcje: otwieranie i zamykanie strumienia pliku, strumień pliku wyjściowego, dołączenie, strumień plików wejściowych i edycja pliku. Edycja pliku oznacza wprowadzanie i wyświetlanie strumienia.

Treść artykułu

  • Otwarcie i zamykanie strumienia plików
  • Wyjściowe działanie strumienia pliku
  • Dołączenie znaków do pliku
  • Wejście Operacja strumienia pliku
  • Odczyt całego pliku za pomocą jednej funkcji
  • Linia czytania po linii
  • Poszukiwanie w pliku
  • Funkcja tellg ()

Otwarcie i zamykanie strumienia plików

Przed otwarciem strumienia należy utworzyć obiekt strumienia. Otwarcie strumienia oznacza ustanowienie kanału między programem C ++ a plik na dysku. Odbywa się to, przez które sekwencja znaków przejdzie do pliku; lub przez którą sekwencję znaków opuści plik i przyjdzie do programu; lub przez które postacie będą poruszać.

Strumień jest otwarty tylko do pisania (wyjściowego), odczytu (wejścia) lub zarówno czytania, jak i pisania. Można go również otworzyć z innych powodów.

Przed otwarciem strumienia obiekt strumienia musi zostać zbudowany. Najprostszym sposobem wyrażenia go jest następujący w funkcji C ++ Main ():

fstream STRM;

Teraz, z obiektem STRM, można użyć funkcji elementu fstream, open () i close (), poprzedzających każdy z operatorem kropkowym. Do otwarcia fstream do czytania można użyć następującego stwierdzenia:

void Open („ścieżka/do/i//plik”, ios_base :: in);

Funkcja członka Open () zwraca void.

W przypadku obiektu strumienia stwierdzenie byłoby:

Strm.otwarty("./myfile ", ios_base :: in);

Ponieważ funkcja członka Open () zwraca void, aby wiedzieć, czy plik na dysku został pomyślnie otwarty, użyj funkcji członka:

bool is_open () const;

Zwraca zero dla false, jeśli plik nie został otwarty, a 1 dla true, jeśli plik zostanie otwarty. Teraz nasz program wygląda tak:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()
fstream STRM;
Strm.otwarty("./myfile ", ios_base :: in);
if (STRM.jest otwarte())
Cout << "Open success" << endl;

w przeciwnym razie
Cout << "Open failed" << endl;
zwrot 1;

powrót 0;

Aby otworzyć plik do pisania, użyj tej flagi:

Strm.Open („ścieżka/do/i//plik”, ios_base :: out);

ios_base :: in oznacza otwarty do czytania i iOS_BASE :: OUT oznacza otwarty do pisania. Aby otworzyć plik do czytania i pisania, użyj:

Strm.Open ("ścieżka/do/i//plik", ios_base :: in | ios_base :: out);

Uwaga: Obecność „iOS_Base :: w | iOS_BASE :: OUT ”, który używa logiczny lub do łączenia obu flag jako pojedynczego argumentu funkcji.

Zamknięcie strumienia oznacza zamknięcie kanału, za pomocą którego dane można wysłać do iz Fro między programem a plikiem. Nie można już wysłać ze sobą w żadnym kierunku za pomocą tego kanału. Zamknięcie strumienia nie zamyka obiektu strumienia. Ten sam strumień może być nadal używany do otwarcia nowego kanału, który należy zamknąć po użyciu w transmisji danych. Uczyń go zwyczajem zamykania dowolnego strumienia plików, po otwarciu. Po zamknięciu strumienia wszelkie dane w pamięci, które miały być w pliku, są wysyłane do pliku przed faktycznym zamknięciem. Prototyp funkcji członka w celu zamknięcia fstream to:

void Close ();

Niestety zwraca pustkę. Aby więc wiedzieć, czy zamknięcie się powiodło, użyj funkcji członka:

bool is_open () const;

Gdyby zamknięcie zakończyło się powodzeniem, powróciłoby to zero, co oznacza, że ​​strumień nie jest już otwarty. Gdyby zamknięcie nie powiodło się, powróciłoby 1 i oznacza to, że strumienia nie można było zamknąć.

Wyjściowe działanie strumienia pliku

Teraz zademonstrujemy otwarcie pliku i podanie nowej zawartości danych. Aby otworzyć strumień wyjściowy z FSReam, po prostu użyj iOS_BASE :: OUT sam w funkcji członka Open (). Poniższy program otwiera plik i wysyła do niego zawartość ciągu:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()
fstream STRM;
Strm.Otwarte ("Doc1.txt ", ios_base :: out);
Jeśli (!Strm.jest otwarte())
Cout << "File could not be opened!" << endl;
zwrot 1;

char str [] = "a: To jest pierwsza linia.\N"
„B: To druga linia.\N"
„C: To trzecia linia.\N";
Strm << str;
Strm.zamknąć();
if (STRM.jest otwarte())
Cout << "Stream could not close!" << endl;
zwrot 1;

Cout << "Success, check file" << endl;
powrót 0;

Nazwa pliku to DOC1.TXT może zawierać pełną ścieżkę lub ścieżkę względną. Nowa zawartość jest identyfikowana przez STR w programie. Na końcu programu treść ciągów zostałaby wstawiona do strumienia, a zatem plik z instrukcją:

Strm << str;

Cout jest standardowym obiektem wyjściowym i jest zwykle używany do konsoli. Używa operatora ekstrakcji, << . Operator ekstrakcji jest również używany ze strumieniami plików. Obiekt strumienia pliku tutaj jest Strm. Znak „\ n” na końcu każdego wycofania powyżej ma upewnić się, że następny wiersz pojawi się poniżej w pliku wyjściowym:

Zamiast wysyłać tekst do pliku z operatorem insercji, można użyć funkcji członka zapisu (). Poniższy kod to ilustruje:

Basic_ostream & Write (const char_type* s, strumień n)

Oto pełny kod z używaną funkcją zapisu:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()
fstream STRM;
Strm.Otwarte ("Doc2.txt ", ios_base :: out);
Jeśli (!Strm.jest otwarte())
Cout << "File could not be opened!" << endl;
zwrot 1;

char str [] = "a: To jest pierwsza linia.\N"
„B: To druga linia.\N"
„C: To trzecia linia.\N";
Strm.Write (str, strlen (str));
Strm.zamknąć();
if (STRM.jest otwarte())
Cout << "Stream could not close!" << endl;
zwrot 1;

powrót 0;

Pierwszym argumentem funkcji zapisu () jest identyfikator tablicy znaków. Drugim argumentem jest liczba znaków (bez \ 0) w tablicy.

Dołączenie znaków do pliku

Aby dołączyć tekst do pliku, użyj samego „iOS_Base :: App” zamiast „iOS_Base :: out” w funkcji członka Open (). Mimo to użyj operatora insercji, <<, as follows:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()
fstream STRM;
Strm.Otwarte ("Doc2.txt ", ios_base :: App);
Jeśli (!Strm.jest otwarte())
Cout << "File could not be opened!" << endl;
zwrot 1;

char str [] = "d: To jest czwarta linia.\N";
Strm << str;
Strm.zamknąć();
if (STRM.jest otwarte())
Cout << "Stream could not close!" << endl;
zwrot 1;

Cout << "Success, check file" << endl;
powrót 0;

Plik wyjściowy powinien teraz mieć cztery linie.

Wejście Operacja strumienia pliku

Teraz zademonstrujemy przeczytanie postaci pliku według postaci z fstream. Aby odczytać plik z fstream, użyj ios_base :: in jako flaga w funkcji członka Open (). Poniższy program odczytuje całą zawartość pliku i wyświetla go w konsoli:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

fstream STRM;
Strm.Otwarte ("Doc1.txt ", ios_base :: in);
Jeśli (!Strm.jest otwarte())
Cout << "Open file failed" << endl;
zwrot 1;

Char C;
chwila (!Strm.eof ())
Strm.Get (c);
Cout << c;

Strm.zamknąć();
powrót 0;

EOF () jest funkcją członkowską i zwraca 1, gdy osiągnięto koniec pliku, a zero inaczej. Program odczytuje znaki pliku, jeden po drugim, aż do osiągnięcia końca pliku. Używa funkcji członka get (), umieszczając znak odczytu w zmienną C, która została już zadeklarowana. Cout wysyła każdą postać do konsoli. Wyjście powinno być:

Odp.: To pierwsza linia.
B: To jest druga linia.
C: To trzecia linia.

Odczyt całego pliku za pomocą jednej funkcji

Cały plik można odczytać za pomocą funkcji członka:

Basic_istream & get (char_type* s, strumień n, Char_Type DeLim);

Kopiuje znaki z pliku i umieszcza je w tablicy postaci. Robi to, dopóki nie spełni ogranicznika, EOF lub dopóki nie skopiuje znaku N - 1. Będzie pasował do postaci NULL („\ 0”) jako ostatniej z rzędu postaci w tablicy. Oznacza to, że liczba znaków wybranych dla tablicy powinna być oszacowana na co najmniej liczbę znaków plików (w tym dowolne \ n), plus jeden dla znaku zerowego. Nie kopiuje postaci ogranicznika. Poniższy kod kopiuje cały plik DOC1.TXT, używając tej funkcji członka:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

fstream STRM;
Strm.Otwarte ("Doc1.txt ", ios_base :: in);
Jeśli (!Strm.jest otwarte())
Cout << "Open file failed" << endl;
zwrot 1;

Char ARR [150];
Strm.Get (ARR, 150, EOF);
Strm.zamknąć();
Cout << arr << endl;
powrót 0;

Linia czytania po linii

Funkcja członka do odczytu z pliku z linią fstream po linii jest:

Basic_istream& getline (char_type* s, strumień n, Char_Type DeLim);

Kopiuje znaki z pliku i umieszcza je w tablicy znaków. Robi to, dopóki nie spełni ogranicznika (e.G. „\ n”) lub dopóki nie skopiuje postaci N - 1. Będzie pasował do postaci NUL („\ 0”) jako ostatniej z rzędu postaci w tablicy. Oznacza to, że liczba znaków wybranych dla tablicy powinna być oszacowana na co najmniej liczbę widocznych znaków, plus jeden dla postaci zerowej. Nie kopiuje postaci ogranicznika. Poniższy kod kopiuje cały plik DOC1.linia txt po linii, używając tej funkcji członka:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

fstream STRM;
Strm.Otwarte ("Doc1.txt ", ios_base :: in);
Jeśli (!Strm.jest otwarte())
Cout << "Open file failed" << endl;
zwrot 1;

Char ARR [100];
chwila (!Strm.eof ())
Strm.getline (ARR, 100, „\ n”);
Cout << arr << endl;

Strm.zamknąć();
powrót 0;

Ponieważ „\ n” nie jest kopiowany podczas kopiowania linii, ENDL musi być używany do wyświetlacza wyjściowego. Zwróć uwagę, że liczba znaków w tablicy i zmiennej strumieniowej, została wykonana taka sama. Jeśli wiadomo z góry, że ograniczenie to „\ n”, można użyć następującej funkcji członka:

Basic_istream& getline (char_type* s, strumień n);

Poszukiwanie w pliku

Znaki, w tym „\ n”, mają swoje naturalne pozycje w pliku, zaczynając od 0, a następnie 1, 2, 3 i tak dalej. Funkcja członka Seekg (POS) wskazałaby wskaźnik na charakter pozycji w obiekcie strumienia. Następnie można użyć (c) do uzyskania tego znaku. Postać z 27th Pozycja obecnego DOC1.plik txt to „b”. Poniższy kod odczytuje i wyświetla go:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

fstream STRM;
Strm.Otwarte ("Doc1.txt ", ios_base :: in);
Jeśli (!Strm.jest otwarte())
Cout << "Open file failed" << endl;
zwrot 1;

Char C;
Strm.Seekg (27);
Strm.Get (c);
Cout << c << endl;
Strm.zamknąć();
powrót 0;

Jeśli podana pozycja jest większa niż w ostatnim znaku w pliku (minus 1), NULL jest zwracany.

Funkcja tellg ()

W miarę odczytania pliku wewnętrzny wskaźnik wskazuje następnego znaku, który ma zostać odczytany. Funkcja członka Tellg () może uzyskać numer pozycji znaku, na który wskazuje wskaźnik. Gdy plik jest właśnie otwarty, Tellg () zwróci 0 dla pierwszego znaku. Po przeczytaniu pierwszego wiersza Tellg () zwróciłby liczbę jak 27 w poniższym przykładzie:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

fstream STRM;
Strm.Otwarte ("Doc1.txt ", ios_base :: in);
Jeśli (!Strm.jest otwarte())
Cout << "Open file failed" << endl;
zwrot 1;

Char ARR [100];
int pos;
Strm.getline (ARR, 100, „\ n”);
POS = STRM.tellg ();
Strm.zamknąć();
Cout << "Position in file is now: " << pos <powrót 0;

Wyjście to:

~ $ ./T9
Pozycja w pliku jest teraz: 27

Równoważną funkcją wyjścia jest tighp ().

Seekdir

Seekdir oznacza kierunek szukania. Jego stałe zdefiniowane w bibliotece IOS_BASE to: błagaj o początek pliku, cur dla bieżącej pozycji pliku i zakończenie zakończenia pliku. Powyższa funkcja Seekg () jest przeciążona dla strumienia wejściowego jako:

Basic_istream & Seekg (Off_Type, ios_base :: SeekDir)

Tak więc, jeśli wewnętrzny wskaźnik wskazuje na znak w pozycji 27, licząc początek od 0, to

Strm.Seekg (0, ios_base :: cur);

Utrzyma wskaźnik w bieżącej pozycji.

Strm.Seekg (5, ios_base :: cur);

Wprowadzi wskaźnik 5 miejsc, aby skierować się na „ja” w drugim „this” Doc1.plik txt.

Strm.Seekg (-5, ios_base :: cur);

Weźmie wskaźnik 5 miejsc w tyle, by wskazać „i” w pierwszej „linii” Doc1.plik txt. Należy zauważyć, że położenie nowej postaci „\ n”, która nie jest wyświetlana na wyjściu, jest liczona.

Teraz bez względu na to, gdzie może być wskaźnik,

Strm.Seekg (0, ios_base :: Beg);

Bierze i utrzymuje wskaźnik na początku pliku; Aby wskazać pierwszą postać pliku, z przesunięciem 0. W takim przypadku wskazuje na „a”.

Strm.Seekg (5, ios_base :: Beg);

Zabierze wskaźnik na początek z przesunięciem 5 miejsc; punkt w „I” w pierwszym „tym” DOC1.plik txt. Zauważ, że pojedyncza przestrzeń jest liczona jako jedna postać.

Negatywna liczba całkowita w pozycji przesunięcia dla „iOS_Base :: Beg” nie jest przydatna.

Cóż, bez względu na to, gdzie może być wskaźnik,

Strm.Seekg (0, ios_base :: end);

Zajmie i utrzyma wskaźnik tuż po zakończeniu pliku; wskazać na nic.

Pozytywna liczba całkowita w pozycji przesunięcia dla „iOS_Base :: END” nie jest przydatna.

Strm.Seekg (-5, ios_base :: end);

Zabierze wskaźnik do końca z przesunięciem 5 miejsc; punkt na „I” w ostatnim „linii” DOC1.plik txt. Zwróć uwagę, że „\ n” i kropka są liczone jako jeden znak każdy.

Poniższy kod ilustruje użycie funkcji, w bieżącej pozycji, z przesunięciem ujemnym i dodatnim:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

fstream STRM;
Strm.Otwarte ("Doc1.txt ", ios_base :: in);
Jeśli (!Strm.jest otwarte())
Cout << "Open file failed" << endl;
zwrot 1;

Char C;
Strm.Seekg (27);
Strm.Seekg (0, ios_base :: cur);
Strm.Get (c);
Cout << c << endl;
Strm.Seekg (-5, ios_base :: cur);
Strm.Get (c);
Cout << c << endl;
Strm.Seekg (+10, ios_base :: cur);
Strm.Get (c);
Strm.zamknąć();
powrót 0;

Wyjście to:

B
N

Funkcja członka get () przesuwa wskaźnik jedno miejsce po jego wykonaniu.

Równoważna funkcja wyjścia jest:

Basic_ostream& Seekp (Off_Type, ios_base :: SeekDir)

Zwróć uwagę na „P” w Seekp dla Put, w przeciwieństwie do „G” w Seekg do Get.

Wniosek

Klasa FSTREAM dotyczy danych wejściowych z pliku do programu C ++ i wyjściem z programu do pliku. Aby użyć fstream C ++, obiekt z klasy musi zostać utworzony. Obiekt strumieniowy musi być otwarty na wejście, wyjście lub jedno i drugie. Aby dołączyć tekst do pliku, strumień musi zostać otwarty do dołączenia. Naławy zawsze zamykania strumienia po jego otwarciu i użyciu. Jeśli plik jest plik obrazu, to ios_base :: Binary będzie musiał być oredowy za pomocą | , z drugim argumentem funkcji członka Open (). Mamy nadzieję, że ten artykuł pomógł w korzystaniu z fstream C ++.