2012-09-03 16 views
18

Co punktem std::ios_base::ate (innych niż std::ios_base::app, na przykład) i std::ios_base::trunc (inne niż std::ios_base::out, na przykład)?std :: ios_base :: jedli i std :: ios_base :: trunc

Czy powinienem raczej pisać std::ios_base::smth zamiast std::ios::smth?

+1

'std :: ios_base :: in' i' std :: ios :: in' powinno być identyczne, to zależy od ciebie. – oldrinb

+0

@veer tak są one, jak również wszelkie :: ios_base :: potomek :: w :) – Geoffroy

Odpowiedz

16

std :: ios_base :: jedli umieścić kursor na końcu tekstu, podczas gdy std :: ios_base_app dopisuje tekst (z operacji zapisu) na końcu, choć nadal można czytać od początku :)

std :: ios_base :: trunc obcina plik, więc jest opróżniany, podczas gdy std :: ios_base :: out po prostu określa, że ​​chcesz pisać do strumienia.

Obecnie nie mogę zacytować standardu (na moim tablecie i Acrobat Reader nie pozwala na wykonanie kopii), ale z punktu 27.4.2.1.4 z ISO 14882: 1998 informacje, które można zobaczyć na łączu są prawie dokładne : http://cplusplus.com/reference/iostream/ios_base/openmode/

Podsumowując:

std::ios_base::app = append 

Dołącz na koniec strumienia przez "szukać [ing], aby zakończyć przed każdym write"

std::ios_base::ate = At The End 

Otwórz i zasięgnąć IMMED iately na końcu po otwarciu

std::ios_base::binary = binary 

wykonać operację binarnie w przeciwieństwie do tekstu

std::ios_base::in = input 

Otwórz w trybie odczytu

std::ios_base::out = output 

w trybie zapisu

std::ios_base::trunc = truncate 

Skróć strumień na otwarty ing.

Wartości te są tylko flagi, więc można otworzyć strumień w odczytu/zapisu binarnego na końcu z:

std::ios_base::in | std::ios_base::out | std::ios_base::ate | std::ios_base::binary 

dotyczące sposobu korzystania z tych wartości, to jak chcesz. Są one zadeklarowane jako publiczne pola statyczne w klasie std::ios_base (patrz 27.4.2), więc można uzyskać do nich dostęp za pomocą std::ios::ate lub nawet coś w rodzaju cout.binary!


Punkty, w których należy podjąć uwagę jest to, że std::ios_base::ate nie oznacza std::ios_base::app ani nie std::ios_base::out implikuje std::ios_base::trunc. Każde pole ma inne znaczenie i inny przypadek użycia, ale większość z nich nie może być użyta samodzielnie :)

+0

Ale std :: ios_base :: out również wyczyścić dane w pliku, nie? Czy możesz podać przykład, w którym std :: ios_base :: out nie wyczyści pliku? – FrozenHeart

+0

Z tego miejsca: http: // cplusplus.com/reference/iostream/ios_base/openmode/otrzymasz definicję każdej wartości. Co więcej, ten komentarz na temat @ ster :: ios_base :: in i std :: ios :: in – Geoffroy

+0

Co masz na myśli mówiąc "nadal możesz czytać od początku"? Czy możesz podać mi przykład? – FrozenHeart

Powiązane problemy