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