2010-02-08 7 views
17

Próbuję dowiedzieć się różnicę między otwarciem pliku jak:Jaka jest różnica między otwarciem pliku a ios :: binary lub ios :: out lub obu?

fstream *fileName*("FILE.dat",ios::binary); 

lub

fstream *fileName*("FILE.dat",ios::out); 

lub

fstream *fileName*("FILE.dat",ios::binary | ios::out); 

Okazało się, że wszystkie te formy są identyczne: we wszystkich przypadkach ten sam wynik w pliku jest tworzony przy użyciu albo *fileName*<< lub *fileName*.write().

Odpowiedz

22

otwiera plik do zapisu.

ios::binary zapewnia, że ​​dane są odczytywane lub zapisywane bez tłumaczenia nowych znaków linii do iz od \r\n w locie. Innymi słowy, dokładnie to, co dajesz strumieniowi, jest dokładnie tym, co zostało napisane.

+0

i co to znaczy używać obu? –

+0

Cóż, pisałbyś do pliku bez tłumaczenia żadnych znaków. –

+2

Więc jeśli nie zaznaczam, że ifstream jest binarny, i czytam, powiedzmy 10 podwójnych od niego, a Windows znajdzie losowy "\ n" w danych, to strumień zostanie rozszerzony z '10 * sizeof (double)' to '10 * sizeof (podwójne) + 1' jako' \ r' jest wstawione i nadpisuje koniec mojego podwójnego bufora? – user14717

4

Otwieranie pliku z ios :: binary kontroluje sposób obsługi znaków nowej linii. W systemie Windows są one rozszerzane do par CRLF. To wszystko - nie ma wpływu na działanie takich operatorów jak: operator < <.

+0

, ale czym są pary CLRF? –

+2

CLRF oznacza powrót karetki, posuw w linii. Są to dwa bajty używane do określenia nowego wiersza w kodowaniu tekstu Windows. Jest to w dużej mierze zbędne, ponieważ na komputerze naprawdę potrzebujesz tylko nowej linii. –

+3

Dawno, dawno temu, w czasach Teletypów i maszyn do pisania, maszyny wyjściowe miały wózki, które przesuwały się w lewo, aby pisać, gdy drukowano znaki. Jedno polecenie, "Powrót karetki", przesunęło wózek z powrotem na lewo. Kolejne polecenie, "Linefeed", przesunęło papier do następnej linii. Te dwie komendy mogą być wykonywane niezależnie, tak aby papier przesuwał się w środkowej linii (za pomocą 'Linefeed') lub przepisując aktualną linię (używając' Carriage Return'). Jako para powodują, że druk zaczyna się od lewego marginesu następnego wiersza. –

Powiązane problemy