2010-10-29 15 views
6

Una delle grandi gioie della programmazione di Windows è ricordarsi di mettere 'wb' o 'rb' o ios :: binary in tutte le chiamate di file aperte in modo che Windows non convertire allegramente tutti i tuoi 0x13s.Perché non Createfile() ha un flag binario

Ho dovuto convertire un bel po 'di codice standard per usare Createfile() per ottenere un certo flag - e mi è venuto in mente che non c'è modo di specificare il binario.
Come fa a sapere? Non voglio davvero che cambi i byte nel mio stream MP4 grazie-molto-molto.

+0

Non riesco proprio a capire la domanda. I file vengono aperti in modalità binaria, quindi non viene modificato CR \ LF. – ruslik

+0

Non si è reso conto che è sempre aperto in modalità binaria. Dal momento che la modalità binaria è una funzionalità sonora di finestra e CreateFile è una versione solo Windows di FILE, sembrava logico che avrebbe fatto questa funzione solo di Windows - o almeno menzionarla nella documentazione –

+0

La modalità testo non è una funzionalità di Windows: è necessaria su qualsiasi macchina che non utilizza un singolo LF per terminare le linee. I Mac pre-X, ad esempio, e ho sentito che alcuni tipi di file su VAX erano/sono trattati più come una tabella, con linee che rappresentano le righe, e l'intera cosa memorizzata in modo molto diverso dai file di "testo" - ma molto meglio per DB- come usare –

risposta

8

Perché CreateFile non esegue conversioni "text-mode"/newline. Questi sono gestiti ad un livello superiore, sia in FILE per CRT che in iostream per C++.

+0

Mai veramente pensato a Createfile come file FILE di livello inferiore, proprio come un equivalente di Windows. Suppongo che per MS tutto sia Windows, quindi scrivi cr/lf e leggi cr/lf, non c'è bisogno di convertirli mai. –

+0

@ Martin Beckett: in realtà, la funzione 'CreateFile()' è appena nominata male. Viene utilizzato per aprire molti, molti altri tipi di risorse (cartelle, unità, porte seriali/parallele, ecc.), Per la maggior parte dei quali testo/binario non ha senso perché non si sta trasferendo del testo. –

+1

CreateFile è l'interfaccia in modalità utente per la funzione del kernel ZwCreateFile, quindi è di basso livello come si può ottenere in modalità utente. – Gerald

1

Non è possibile specificare un indicatore binario o di testo, perché per il sistema operativo Windows tutti i file sono binari! Le opzioni wb e rb sono introdotte come una caratteristica, come parte della funzionalità C IO stream, e anche in questo caso solo su DOS/Windows, per aiutare lo sviluppatore a leggere e scrivere file di testo ed eseguire la conversione da CR/LF a LF.

6

Tutto è binario per quanto riguarda l'API di Windows. Personalmente preferisco così. Non uso mai la "modalità testo" nella libreria standard.

+0

+1: sono assolutamente d'accordo. Soprattutto che molti strumenti di livello superiore filtrano CR/LF solo quando sanno che stai leggendo del testo. Ad esempio, la 'libreria standard' 'filtra quando usa' operator >> 'con' std :: string' ma non quando usa 'get (char *, streamsize)'. –

Problemi correlati