2015-06-12 34 views
5

Bu soru, dosyalara veri okurken ve yazarken ifstream ve ofstream'in davranışlarıyla ilgilidir. Ben operator<< (akış ekleme operatörü) çıkıştan önce temsilini metne iki katına gibi nesneleri dönüştürür ve read() çağrıları ve write() okuma öğrenmek ve depolanan ham veri yazmasına başarmış stackoverflow.com etrafında okuyuncaC++ ifstream, ofstream: Ham okuma()/write() çağrıları ile ikili modda açılış dosyası arasındaki fark nedir?

sırasıyla bellek (ikili biçim). DÜZENLEME: Bu çok açık, burada beklenmedik bir şey yok.

Ben de ikili modda bir dosya açılırken, farklı işletim sistemleri gerektirdiği gibi yeni satır karakterleri otomatik çeviri engeller öğrendim.

Benim soru şudur: Bu otomatik çeviri, örneğin mu; read() ve write() işlevlerini çağırırken \n - \r\n arası ne olur? Veya bu davranış sadece operator<<'a özgüdür. (Ve ayrıca operator>>.)

Not burada benzer ancak biraz daha az spesifik bir soru vardır. Kesin bir cevap vermez. Difference in using read/write when stream is opened with/without ios::binary mode

+1

[İkili ve metin modları] (http://en.cppreference.com/w/cpp/io/c#Binary_and_text_modes) –

+2

@ πάνταῥεῖ Bu soruya cevap vermiyor. OP'nin ikili ve metin modu arasındaki farkı anladığı görülüyor. Sorun, C++ akışında Biçimlendirilmiş ve Biçimlendirilmemiş G/Ç ek kavramının var olmasıdır. Anladığım kadarıyla, bu soru bu ikisinin nasıl etkileştiği ile ilgili. – ComicSansMS

+0

Bu davranış da read()/write() için de geçerli değil mi? – user3728501

cevap

4

daha düşük bir seviyede ikili ve metin modunda onun arasındaki fark.

Metin modunda bir dosya açarsanız, read ve write işlemlerini kullanırken bile çeviri verisi alırsınız.

Ayrıca, bir metin dosyasındaki bir konuma yalnızca tell (veya 0) adresinden elde edilmişse seek numarasına izin verildiğini de unutmayın. Rasgele konumlandırmayı yapabilmek için, dosyanın ikili modda açılmış olması gerekir.

-2

Kısa cevap - okumak kullanarak zaman yapılır hiçbir çeviri() & yazma(). [Bu sorunun cevabı "hayır" şeklindedir.]

Daha uzun yanıt - read() & write() ikili modda çalışır; bu, içeriklerin "ikili veri" olduğu kabul edilir. Bir \ n bir ASCII 10 ve 10, örneğin, sayı 10.

r \ \ n \ n değişen Bu iş, bir Windows konudur temsil edebilir meşru veri değeridir. Linux'ta, satır sonu basitçe \ n ile işaretlenir ve çeviri gerekmez. Eğer http://linux.die.net/man/3/fopen de Fopen kılavuz sayfasına bakarsanız

yardımcı olacak bu paragraf

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

Umarım var.

+0

Reddettiğim için özür dilerim ama aslında yanlış. Bir, 'istream :: read() 've' ostream :: write() 'do * not * ikili modda garanti işlemi (çünkü metin ve ikili mod arasındaki farklar, standart kütüphane seviyesinde değil, OS seviyesinde gerçekleşir). Bir metin modu akışında Write() 'ı, satır uçlarıyla uğraşmadan * metin * arabelleği yazmayı düşünün. Diğer tüm bahisler kapalı. Ayrıca, POSIX (metin modunu ikili modla aynı şekilde işlemek için * olan *), daha az akılda kalan bir platformda yüzünüzde havaya uçurmayacağı anlamına gelmez. – DevSolar

+0

@DevSolar, istemiyorum demedim: read() ve ostream :: write(). Yazar istream :: read() ve ostream :: write() anlamına gelebilir ama okuduğum şey read() ve write() idi ve read() ve write() için bir cevap verdim. Soruyu yanlış anlamış olabilirim (ki bu muhtemelen muhtemel görünüyor) ama bu benim cevabımı aslında yanlış mı yapıyor? (Yanlış içeriğe sahip olmasını sağlar ama nasıl yanlıştır? Sistem çağrılarını oku() ve yaz().) –

+0

@DevSolar, Eğer haklıysanız, bu belgeler yanlış görünüyor. [link] (http://www.cplusplus.com/reference/ostream/ostream/write/?kw=write) ve [bağlantı] (http://www.cplusplus.com/reference/ostream/ostream/write/ “kw = write” dedikleri gibi “basitçe bir veri bloğunu kopyalar…” Şimdi, belki de yanılıyorlar ya da belki “basitçe kopyalar…” ifadesini anlamıyorum çünkü \ n to \ r \ n bir çeviri (sadece "kopyalar" değil). –