2015-06-12 13 views
5

To pytanie dotyczy zachowania ifstream i outstream podczas odczytu i zapisu danych do plików.C++ ifstream, ofstream: Jaka jest różnica między surowymi wywołaniami read()/write() a otwieranymi plikami w trybie binarnym?

Od czytania wokół stackoverflow.com udało mi się dowiedzieć, że (operator strumień wstawiania) operator<< konwertuje obiektów, takich jak podwójna tekstowych reprezentacji przed wyjściem, a także wzywa do read() i write() odczytu i zapisu danych surowych, jak to jest zapisane w pamięć (format binarny) odpowiednio. EDYCJA: To jest oczywiste, nic nieoczekiwanego.

Odkryłem również, że otwarcie pliku w trybie binarnym uniemożliwia automatyczne tłumaczenie znaków nowej linii zgodnie z wymaganiami różnych systemów operacyjnych.

Moje pytanie brzmi: czy to automatyczne tłumaczenie, np.; od \n do \r\n występuje podczas wywoływania funkcji read() i write()? Czy to zachowanie jest specyficzne dla modelu operator<<. (A także: operator>>.)

Uwaga istnieje podobne, ale nieco mniej szczegółowe pytanie tutaj. Nie daje jednoznacznej odpowiedzi. Difference in using read/write when stream is opened with/without ios::binary mode

+1

[Tryby binarne i tekstowe] (http://en.cppreference.com/w/cpp/io/c#Binary_and_text_modes) –

+2

@ πάνταῥεῖ To nie odpowiada na pytanie. Wydaje się, że PO zrozumiał różnicę między trybem binarnym a tekstowym. Problem polega na tym, że w strumieniach C++ jest dodatkowa koncepcja sformatowanych i niesformatowanych operacji we/wy. Jak to zrozumiałem, to pytanie dotyczy tego, jak te dwie interakcje. – ComicSansMS

+0

Czy to zachowanie ma również zastosowanie do read()/write(), czy też nie? – user3728501

Odpowiedz

4

Różnica pomiędzy trybem binarnym i tekstowym na niższym poziomie.

Jeśli otworzysz plik w trybie tekstowym, otrzymasz przetłumaczone dane nawet podczas korzystania z operacji read i write.

Należy również pamiętać, że możesz mieć seek na pozycję w pliku tekstowym tylko wtedy, gdy pozycja została uzyskana z poprzedniego tell (lub 0). Aby móc wykonywać losowe pozycjonowanie, plik musiał zostać otwarty w trybie binarnym.

-2

Krótka odpowiedź - brak tłumaczenia przy użyciu read() & write(). [Odpowiedź na twoje pytanie brzmi "nie"]

Dłuższa odpowiedź - read() & write() działa w trybie binarnym, co oznacza, że ​​zawartość jest uważana za "dane binarne". A \ n to ASCII 10, a 10 to prawidłowa wartość danych, która może na przykład reprezentować liczbę 10.

Ta sprawa zmiany \ n na \ r \ n jest problemem z systemem Windows. W Linuksie koniec linii jest oznaczony po prostu \ n, a tłumaczenie nie jest potrzebne.

Jeśli spojrzeć na stronie podręcznika dla fopen w http://linux.die.net/man/3/fopen jest ten ustęp

The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.) 

Mamy nadzieję, że pomoże.

+0

Przepraszamy za utracone zdanie, ale w rzeczywistości jest niepoprawne. One, 'istream :: read()' oraz 'ostream :: write()' do * not * gwarantują operację w trybie binarnym (ponieważ różnice między tekstem a trybem binarnym zdarzają się na poziomie OS, a nie na standardowym poziomie biblioteki). Pomyśl o 'write()' w strumieniu w trybie tekstowym, gdy piszesz bufor * text * bez kłopotów z końcami linii. Wszystkie inne zakłady są wyłączone. Również, powoływanie się na POSIX (który * dzieje się * w celu obsługi trybu tekstowego tak samo jak w trybie binarnym) nie oznacza, że ​​założenie nie wysadzi się w twoją twarz na mniej zdrowej platformie. – DevSolar

+0

@DevSolar, nie powiedziałem, że istream :: read() i ostream :: write(). Autor mógł mieć na myśli istream :: read() i ostream :: write(), ale to, co przeczytałem, to read() i write(), a ja dałem odpowiedź dla read() i write(). Być może źle zrozumiałem pytanie (które teraz wydaje się prawdopodobne), ale jak to sprawia, że ​​moja odpowiedź jest w rzeczywistości błędna? (Sprawia, że ​​ma zły kontekst, ale jak jest niepoprawny? Myśl o wywołaniach systemowych read() i write().) –

+0

@DevSolar, Jeśli masz rację, wygląda na to, że te dokumenty są błędne. [link] (http://www.cplusplus.com/reference/ostream/ostream/write/?kw=write) i [link] (http://www.cplusplus.com/reference/ostream/ostream/write/ ? kw = write) w tym, że mówią: "po prostu kopiuje blok danych ..." Teraz być może oni są w błędzie lub może nie rozumiem zwrotu "po prostu kopie ...", ponieważ \ n do \ r \ n jest tłumaczeniem (nie "po prostu kopiami"). –

Powiązane problemy