Históricamente, el modo binario proporciona un acceso más o menos transparente a la transmisión subyacente; el modo de texto "se normaliza" a una representación de texto estándar , donde las líneas terminan con el carácter '\n'
único. Además, el sistema puede imponer restricciones en el tamaño de un archivo binario, por ejemplo, requiriendo que sea un múltiplo de 128 o 512 bytes. (El primero fue el caso de CP/M, el segundo de muchos de los DEC OS). Los archivos de texto no tienen esta restricción, y en los casos en que lo impuso el sistema operativo, la biblioteca típicamente introducirá un extremo adicional del carácter de archivo para archivos de texto. (Incluso hoy, la mayoría de las bibliotecas de Windows reconocen el antiguo archivo CP/M, 0x1A, al leer en el modo de texto ). Debido a estas consideraciones, el modo de texto solo se define sobre un conjunto limitado de valores binarios. (Pero si escribe 200 bytes en un archivo binario , puede recuperar 256 o 512 cuando vuelva a leerlo. Históricamente, el binario solo se debe utilizar para texto que de otra forma esté estructurado, así que para que pueda reconocer la lógica final, e ignore estos bytes adicionales.)
Además, puede buscar casi arbitrariamente en un archivo abierto en el modo binario ; solo puede buscar al principio o en una posición que haya memorizado , en modo texto. (Esto se debe a que la línea que termina asignaciones significan que no hay una relación simple entre la posición en el archivo, y la posición en la secuencia de texto.)
Tenga en cuenta que esto es ortogonal a si la salida se formatea o no : si emite usando <<
(y la entrada usando >>
), el IO se formatea, independientemente del modo en que se abrió el archivo. Y el formato es siempre texto; los iostreams están diseñados para manipular flujos de texto , y solo tienen soporte limitado para entrada y salida sin texto.
Hoy en día, la situación ha cambiado un poco: en muchos casos, esperamos que lo escribimos para ser legible desde otras máquinas, lo que supone un formato definido así , que no puede ser utilizado de forma nativa el formato. (Por lo tanto, para el ejemplo , Internet espera la secuencia de dos bytes 0x0D, 0x0A como una línea final, que es diferente de lo que se usa internamente en Unix y muchos otros sistemas operativos ). Si la portabilidad es una preocupación, generalmente define una , escríbalo explícitamente y use el modo binario para asegurarse de que lo que escriba sea exactamente lo que está escrito; De forma similar en la entrada, utiliza el formato binario y maneja las convenciones de forma manual. Si solo está escribiendo en un disco local, que no se comparte, sin embargo, el modo de texto está bien, y un poco menos trabajo.
Nuevamente, ambos se aplican al texto. Si desea un formato binario, debe usar el modo binario, pero eso está lejos de ser suficiente. Tendrá que implementar todo el IO formateado usted mismo. En tales casos, por lo general no uso o std::istream
std::ostream
(cuyo texto es la abstracción), sino más bien definir mis propios tipos de trenes, que deriva de std::ios_base
(para las convenciones de control de errores), y el uso de std::streambuf
(por la física IO).
Por último, no olvide que todos IO tiene el formato de alguna manera . Simplemente escribir un bloque de memoria en el archivo significa que el formato es lo que sea que la implementación actual le dé (que generalmente no está documentado, lo que significa que probablemente no podrá leerlo en el futuro). Si todo lo que hace es propagarse al disco, y la única vez que lo leerá es con el mismo programa, compilado con la misma versión del mismo compilador , usando las mismas opciones de compilación, entonces puede simplemente volcar memoria, siempre que la memoria en cuestión sea solo PODs, y no contenga punteros. De lo contrario, debe definir (y documentar) el formato que utiliza e implementarlo. En tales casos, sugeriría usar un formato existente, como XDR, en lugar de inventar el suyo: es mucho más fácil escribir "utiliza el formato XDR" como documentación, en lugar de describiendo el diseño de bit y byte real para todos de los diferentes tipos .
Sospecho que es un duplicado de http://stackoverflow.com/questions/229924/difference-between-files-writen-in-binary-and-text-mode, pero no estoy seguro. – jogojapan
@jogojapan, prácticamente. Pero esa publicación no responde completamente mi pregunta. – Alcott