Eğer dosyayı okuyorsun BINARY veya METİN modunda? Gelen METİN modu çifti satırbaşı / satır besleme, CRLF , olarak yorumlanır METİN satırın sonuna veya satır karakteri sonunda, ancak BINARY sadece getirme TEK , bir anda hangi araçları byte bu da karakter MUTLAKAdikkate alınmaz ve başka bir bayt olarak getirilmek üzere arabellekte bırakılır! Satır dönüşü, daktiloda, baskı kolunun bulunduğu daktilo arabasının kağıdın sağ kenarına ulaştığı ve sol kenarına geri döndüğü anlamına gelir. Bu mekanik daktilonun çok mekanik bir modelidir. Daha sonra satır besleme, kağıt rulosunun biraz yukarı döndürüldüğü ve böylece kağıdın başka bir yazma satırına başlayacak konumda olduğu anlamına gelir. ASCII'deki düşük rakamlardan birini hatırladığım kadarıyla, yazı yazmadan sağa bir karakter, ölü karakter ve tabii ki \ b geri boşluk anlamına geliyor: arabayı bir karakter geri hareket ettir. Bu şekilde, genişletilmiş bir klavyeye ihtiyaç duymadan altta yatan (alt çizgi yazın), üstü çizili (eksi tür), farklı aksanları yaklaşık olarak iptal etme (X türü) gibi özel efektler ekleyebilirsiniz, satır beslemesine girmeden önce hat boyunca arabanın konumunu ayarlayarak. Böylece, arada bir bilgisayar olmadan bir daktiloyu otomatik olarak kontrol etmek için bayt boyutlu ASCII voltajlarını kullanabilirsiniz. Otomatik daktilo tanıtıldığında,OTOMATİK , kağıdın en uzak kenarına ulaştığınızda aracın sola dönmesi VE satır beslemesinin uygulandığı, yani rulo yukarı hareket ederken arabanın otomatik olarak geri döneceği varsayımı anlamına gelir! Bu nedenle, her iki kontrol karakterine de ihtiyacınız yoktur, yalnızca bir, \ n, yeni satır veya satır beslemesi gerekir.
Bunun programlama ile ilgisi yok ama ASCII daha eski ve HEY! Görünüşe göre bazı insanlar metin şeyler yapmaya başladıklarında düşünmüyorlardı! UNIX platformu, elektrikli bir otomatik tip makineyi varsayar; Windows modeli daha eksiksizdir ve mekanik makinelerin kontrolüne izin verir, ancak bazı kontrol karakterleri bilgisayarlarda gittikçe daha az kullanışlı hale gelse de, çan karakteri gibi, 0x07, iyi hatırlıyorsam ... Bazı unutulmuş metinler orijinal olarak kontrol karakterleriyle yakalanmış olmalı elektrikle kontrol edilen daktilolar için ve modeli sürdürdü ...
Aslında doğru varyasyon, satır beslemesini dahil etmek olacaktır, satır başı gereksizdir, yani otomatiktir, dolayısıyla:
char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...
her tür dosyayı işlemenin en doğru yolu olacaktır. Not Ancak n o \ METİN modu aslında bayt çifti 0x0D 0x0a olmakla 0x0D IS sadece \ r \ n içinde \ r içerir METİN modunda ama değil BİNARY ... yani \ n ve \ r \ n eşdeğerdir ya olmalı. Bu çok temel bir endüstri karmaşası aslında, tipik endüstri ataleti, çünkü kongre TÜM platformlarda CRLF'den bahsediyor, sonra farklı ikili yorumlara düşüyor. Açıkçası, SADECE 0x0d (satır başı) olarak \ n (CRLF veya satır besleme) içeren dosyalar, METİNmodu (daktilo makinesi: sadece arabayı döndür ve her şeyin üstünü çiz ...) ve satır yönelimli olmayan ikili biçimdir (ya \ r ya da \ r \ n satır yönelimli anlamına gelir), bu yüzden metin olarak okumaman gerekmiyor! Kodun bir kullanıcı mesajıyla başarısız olması gerekir. Bu sadece işletim sistemine bağlı değildir, aynı zamanda kafa karışıklığına ve olası varyasyonlara katkıda bulunan C kütüphanesi uygulamasına da bağlıdır ... (özellikle kafa karıştırıcı varyasyonlar için başka bir eklem noktası ekleyen şeffaf UNICODE çeviri katmanları için).
Önceki kod parçacığı (mekanik daktilo) ile ilgili sorun, \ r (otomatik daktilo metni) 'den sonra \ n karakter yoksa çok verimsiz olmasıdır. Daha sonra , C kitaplığının metin yorumlarını (yerel ayar) yok saymaya ve tam baytları dağıtmaya zorlandığı BINARY modunu da varsayar . Her iki mod arasında gerçek metin karakterleri arasında hiçbir fark olmamalıdır, yalnızca kontrol karakterlerinde, bu nedenle genel olarak BINARY okuma , METİN modundan daha iyidir . Bu çözüm, BINARYC kitaplık varyasyonlarından bağımsız olarak tipik Windows işletim sistemi metin dosyaları modu ve diğer platform metin biçimleri için verimsiz (metne web çevirileri dahil). Verimliliği önemsiyorsanız, gitmenin yolu bir işlev işaretçisi kullanmaktır, \ r vs \ r \ n satır kontrolleri için istediğiniz gibi bir test yapın, ardından işaretçiye en iyi getline kullanıcı kodunu seçin ve onu buradan çağırın. o.
Bu arada ben de bazı metin dosyaları bulduğumu hatırlıyorum ... bu da bazı basılı metin tüketicileri için hala gerekli olduğu gibi çift satırlı metne çevrilir.