2013-06-02 20 views
12

Bir C programından standart veriyi yazmanın en iyi yolunu bulmaya çalışıyorum. Linux'ta iyi çalışıyor, ancak Windows'da derlediğimde "\ n" "\ r \ n" ye dönüştürüldüğü için sorunlarım var.İkili modda stdout'a yazmanın en kolay yolu nedir?

Yeni satır dönüştürmeyi engelleyen bir tür ikili modda stdout'a yazmak için standart bir yol var mı? Değilse, Windows bunu yapmayı durdurmak için en basit yolu nedir?

GCC ve MinGW kullanıyorum. Linux ile uyumlu tutmak istiyorsanız

+0

Şu anda nasıl şeyler çıkıyorsunuz? –

+1

'printf' yerine' fwrite' kullanmayı denediniz mi? – tay10r

+0

Şu anda fwrite kullanıyorum. – jncraton

cevap

18

Sen

setmode(fileno(stdout), O_BINARY) bir ifdef bunu sarın kullanabilirsiniz.

Sen (çapraz platform tür) böyle bir şey yapabilirsiniz ayrıca http://msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.80).aspx

+0

Bu işe yarıyor. Teşekkürler! En azından ortamımda, setmode ikinci bir parametre gerektirdi. Cevabı güncelledim. – jncraton

+3

'freopen (NULL," wb ", stdout)' da kullanılabilir ve taşınabilir C'dir. Ancak, istenmeyen kesme etkileri olabilir; http://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html'nin Uygulama Kullanımı bölümüne bakın. Değeri için, bu metnin yanlış olduğunu düşünüyorum; Yeni dosya adı NULL olduğunda, altta yatan 'açık' işlem yoktur ve bu nedenle O_TRUNC ile ilgili metin geçerli değildir. –

+0

@R .. Windows'da 'NULL' dosya adıyla 'freopen' kullanamazsınız, buna göre geçersiz parametre işleyicisini çağırır: http://msdn.microsoft.com/en-us/library/wk2h68td.aspx ve geçersiz parametre işleyicisinin varsayılan davranışı uygulamayı kilitlemektir. – Vargas

5

bakınız:

FILE *const in = fdopen(dup(fileno(stdin)), "rb"); 
FILE *const out = fdopen(dup(fileno(stdout)), "wb"); 
/* ... */ 
fclose(in); 
fclose(out); 

Yoksa write() kullanabilir ve read() sistem fileno(stdin) ve fileno(stdout) doğrudan çağırır. Bu sistem çağrıları daha düşük seviyede çalışır ve herhangi bir dönüşüm gerçekleştirmez. Ancak, FILE akışından aldığınız arabelleğe alma da yoktur.

+0

'write()' ile ilgili kısım yanlış görünüyor, ben hala onu kullanarak satırsonu dönüşümleri alıyorum –

+0

En çok sistem çağrısını kullanmıyorsunuz 'write()' 'man -s 2 write'. Bu seviyede metin/ikili mod yoktur. –

İlgili konular