2011-03-02 16 views
8

C++ ile imzasız karakter dizisi ofstream fout("filename"); kullanarak çıktıyorum ancak aralarında sahte bir karakter üretiyor. Bu sorun sağlayan kod parçasıdır:Neden yönlendirme 0x0D'den önce bir 0x0D bayt ekler?

for(int i = 0; i < 12; i++) 
fout << DChuffTable[i]; 

ve bu dizinin tanımı: çıktı dosyası olarak

unsigned char DChuffTable[12] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B}; 

I 0x09 ve 0x0A arasında gerçek olmayan 0x0D alır. Diziyi hata ayıklama modunda kontrol ettim, yazdırılmadan hemen önce değişmedi ve değişmedi. Lütfen bana bu problem hakkında ne düşündüğünü söyle.

cevap

21

Akışınız metin modunda açılıyor ve 0x0A satır besleme (LF) karakteri olduğundan, bu 0x0D0x0A, yani CR/LF için akışınızda tarafından dönüştürülen ediliyor.

ikili modda akımı açar:

std::ofstream fout("filename", std::ios_base::out | std::ios_base::binary); 

Sonra biten hat dönüşümler yapılmamalıdır.

Bu, akışlar garipleşebilir çünkü bu genellikle iyi bir fikir olarak kabul edilir. metin modundayken kızarma.

+0

Çok teşekkürler, bu problemi düşünmedim. Yine de bu sorunun linux'ta meydana geldiğinden şüpheleniyorum. sağ? – raven

+0

@raven: Aynı senaryo geçerlidir, ancak Unix sistemleri "\ n" yi bir satır sonu olarak kullandığından, aslında herhangi bir belirti fark etmeyecektiniz. Yine de bozuk kod var. :) –