2010-10-29 690 views
6

Una de las grandes alegrías de la programación de las ventanas es recordar a poner 'wb' o 'rb' o ios :: binarios en todas las llamadas de apertura de archivos para que Windows no lo hace Convierte alegremente todos tus 0x13.Por qué no Createfile() tiene un indicador binario

Solo tuve que convertir un montón de código muy estándar para usar Createfile() para obtener una determinada marca, y se me ocurrió que no hay forma de especificar el binario.
¿Cómo lo sabe? Realmente no quiero que cambie los bytes en mi secuencia de MP4 gracias-mucho-mucho.

+0

Simplemente no puedo entender la pregunta. Los archivos se abren en modo binario, por lo que no se cambia CR \ LF. – ruslik

+0

No me di cuenta que siempre se abrió en modo binario. Desde el modo binario es una característica ventana sonly y CreateFile es una ventana única versión de File parecía lógico que lo haría esta ventana sólo funcionan - o por lo menos lo menciona en los documentos –

+0

modo de texto no es una única característica de Windows: se necesita en cualquier máquina que no use un solo LF para terminar líneas. Pre-X Mac, por ejemplo, y he escuchado algunos tipos de archivos en VAX fueron tratados más como una tabla, con líneas que representan filas, y todo almacenado de forma muy diferente a los archivos de "texto", pero mucho mejor para DB- como uso –

Respuesta

8

Debido a CreateFile no hace "modo texto"/conversiones de nueva línea. Esos se manejan en un nivel superior, ya sea en ARCHIVO para CRT o iostreams para C++.

+0

Nunca pensé realmente en Createfile como un ARCHIVO de nivel inferior, solo como un equivalente de Windows. Supongo que para MS todo es Windows así que escribes cr/lf y lees cr/lf, sin necesidad de convertir nunca. –

+0

@Martin Beckett: en realidad, la función 'CreateFile()' apenas tiene un nombre. Se usa para abrir muchos, muchos otros tipos de recursos (carpetas, unidades, puertos serie/paralelo, etc.), para la mayoría de los cuales texto/binario no tiene sentido porque no está transfiriendo texto. –

+1

CreateFile es la interfaz de modo de usuario para la función del kernel ZwCreateFile, por lo que es de bajo nivel que se puede obtener en el modo de usuario. – Gerald

1

no puede especificar un indicador binario o de texto, ya que el sistema operativo de Windows, todos los archivos son binarios! Las opciones de wb y rb se introducen como una característica, como parte de la funcionalidad de transmisión C IO, e incluso solo en DOS/Windows, para ayudar al desarrollador a leer y escribir archivos de texto y realizar conversión CR/LF a LF.

6

Todo es binaria en lo que se refiere a la API de Windows. Personalmente, lo prefiero de esa manera. Nunca utilizo el "modo de texto" en las cosas de la biblioteca estándar.

+0

+1: Estoy totalmente de acuerdo. Especialmente muchas herramientas de alto nivel filtran CR/LF solo cuando saben que estás leyendo un texto. Por ejemplo, la biblioteca estándar '' se filtra cuando se usa 'operator >>' con 'std :: string' pero no cuando se usa' get (char *, streamsize) '. –

Cuestiones relacionadas