2013-04-29 14 views
6

Właśnie zacząłem się zastanawiać - w jaki sposób tak naprawdę std::fstream otwiera się z std::ios::in i std::ios::out faktycznie ma działać? Co powinien zrobić? Napisz coś do (na przykład) pustego pliku, a następnie przeczytaj ... co? Tylko napisana wartość? Gdzie znajdowałby się plik "wskaźnik"/"kursor"? Może odpowiedzi już tam są, ale po prostu nie mogłem tego znaleźć.W jaki sposób powinien działać std :: fstream z wejściami i wyjściami?

Odpowiedz

5

Co to jest std::fstream?

std::fstream to dwukierunkowa klasa plików strumieniowych. Oznacza to, że zapewnia interfejs dla plików wejściowych i wyjściowych. Jest powszechnie używany, gdy użytkownik musi czytać i pisać w tej samej sekwencji zewnętrznej.

Przy uruchamianiu dwukierunkowego strumienia pliku (w przeciwieństwie std::ofstream lub std::ifstream), przy czym openmodes ios_base::in i ios_base::out podano domyślnie. Oznacza to, że:

std::fstream f("test.txt", std::ios_base::in | std::ios_base::out); 

jest taka sama jak

std::fstream f("test.txt"); 

można by określić obie opcje, jeśli musieli także dodać kilka niestandardowych openmodes takich jak trunc, ate, app lub binary. Tryb otwarty ios_base::trunc jest potrzebny, jeśli chcesz utworzyć nowy plik dla dwukierunkowych operacji we/wy, ponieważ tryb otwarty ios_base::in uniemożliwia utworzenie nowego pliku.

dwukierunkowe I/O

dwukierunkowe I/O jest wykorzystywanie dwukierunkowych strumienia zarówno dla wejścia i wyjścia. W IOStreamach strumienie standardowe zachowują sekwencje znaków w buforze, który służy jako źródło lub pochłaniacz danych. W przypadku strumieni wyjściowych istnieje obszar "put" (bufor przechowujący znaki dla danych wyjściowych). Podobnie, w przypadku strumieni wejściowych istnieje obszar "get".

W przypadku std::fstream (klasa dla danych wejściowych i) zawiera bufor wspólnego pliku reprezentujący odpowiednio odpowiednio obszar get i put. Na wskaźnik pozycji, który zaznacza bieżącą pozycję w pliku, wpływają operacje wyjściowe: i. Jako takie, w celu wykonywania operacji we/wy poprawnie na dwukierunkowego strumienia, istnieją pewne zasady, których należy przestrzegać:

  • Podczas wykonywania odczytu po zapisie lub odwrotnie, strumień powinien zostać przeniesiony z powrotem.
  • Jeśli operacja wprowadzania trafi na koniec pliku, natychmiastowe wykonanie zapisu jest w porządku.

Dotyczy tylko std::fstream. Powyższe zasady nie są potrzebne dla std::stringstream.

Mam nadzieję, że odpowiedzą na twoje pytania. Jeśli masz więcej, możesz po prostu zapytać w komentarzach.

Powiązane problemy