ver ventajas texto son sirve que programacion para los leer hacen funciona extension extendido escribir entre ejemplos diferencia datos como codigos codigo características binarios binario archivos archivo abrir c++ ascii binaryfiles file-format

c++ - ventajas - Cómo identificar el contenido del archivo como ASCII o binario



ventajas de archivos binarios (10)

Bueno, esto depende de tu definición de ASCII. Puede verificar los valores con el código ASCII <128 o para algunos juegos de caracteres que defina (por ejemplo, ''a'' - ''z'', ''A'' - ''Z'', ''0'' - ''9'' ...) y trate el archivo como binario si contiene algunos otros caracteres.

También puede verificar los saltos de línea regulares (0x10 o 0x13, 0x10) para detectar archivos de texto.

¿Cómo identifica el contenido del archivo como en ASCII o binario usando C ++?


Eche un vistazo a cómo funciona el comando de archivo ; tiene tres estrategias para determinar el tipo de archivo:

Según su plataforma y los posibles archivos que le interesen, puede ver su implementación o incluso invocarla.


El contenido de cada archivo es binario. Entonces, sin saber nada más, no puedes estar seguro.

ASCII es una cuestión de interpretación. Si abre un archivo binario en un editor de texto, verá lo que quiero decir.

La mayoría de los archivos binarios contienen un encabezado fijo (por tipo) que puede buscar, o puede tomar la extensión del archivo como una sugerencia. Puede buscar marcas de orden de bytes si espera archivos codificados en UTF, pero también son opcionales.

A menos que defina su pregunta más de cerca, no puede haber una respuesta definitiva.


Esta pregunta realmente no tiene una respuesta correcta o incorrecta, solo soluciones complejas que no funcionarán para todos los archivos de texto posibles.

Aquí hay un enlace, el artículo The Old New Thing sobre cómo notepad detecta el tipo de archivo ascii. No es perfecto, pero es interesante ver cómo lo maneja Microsoft.


Mi editor de texto decide sobre la presencia de bytes nulos. En la práctica, eso funciona muy bien: un archivo binario sin bytes nulos es extremadamente raro.


Para verificar, debes abrir el archivo como binario. No puedes abrir el archivo como texto. ASCII es efectivamente un subconjunto de binario. Después de eso, debes verificar los valores de bytes. ASCII tiene valores de byte 0-127, pero 0-31 son caracteres de control. TAB, CR y LF son los únicos caracteres de control comunes. No puede (portablemente) usar ''A'' y ''Z''; no hay garantía de que estén en ASCII (!). Si los necesita, tendrá que definir.

const unsigned char ASCII_A = 0x41; // NOT ''A'' const unsigned char ASCII_Z = ASCII_A + 25;


Si la pregunta es realmente cómo detectar solo ASCII, entonces la respuesta de litb es inmediata. Sin embargo, si san fue después de saber cómo determinar si el archivo contiene texto o no, entonces el problema se vuelve mucho más complejo. ASCII es solo una forma de representar el texto, cada vez más impopular. Sistemas Unicode: UTF16, UTF32 y UTF8 han crecido en popularidad. En teoría, pueden probarse fácilmente comprobando si los dos primeros bytes son la marca de orden de bytes unicocde (BOM) 0xFEFF (o 0xFFFE si el orden de bytes está invertido). Sin embargo, como esos dos bytes arruinan muchos formatos de archivo para sistemas Linux, no se garantiza que estén allí. Además, un archivo binario podría comenzar con 0xFEFF.

Buscar 0x00 (u otros caracteres de control) tampoco ayudará si el archivo es unicode. Si el archivo es UFT16 decir, y el archivo contiene texto en inglés, todos los demás caracteres serán 0x00.

Si conoce el idioma en el que se escribirá el archivo de texto, entonces sería posible analizar los bytes y determinar estadísticamente si contiene texto o no. Por ejemplo, la letra más común en inglés es E seguida de T. Entonces, si el archivo contiene muchas más E y T que Z y X, es probable que sea texto. Por supuesto, sería necesario probar esto como ASCII y varios unicodes para estar seguro.

Si el archivo no está escrito en inglés, o si desea admitir varios idiomas, las únicas dos opciones restantes son mirar la extensión de archivo en Windows y verificar los primeros cuatro bytes en una base de datos de códigos de "archivo mágico" para determinar el tipo de archivo y, por lo tanto, si contiene texto o no.


Si un archivo contiene solo los bytes decimales 9-13, 32-126, probablemente sea un archivo de texto ASCII puro. De lo contrario, no lo es. Sin embargo, aún puede ser texto en otra codificación.

Si, además de los bytes anteriores, el archivo contiene solo los bytes decimales 128-255, es probable que sea un archivo de texto en una codificación basada en ASCII de 8 bits o de longitud variable, como ISO-8859-1, UTF-8 o ASCII + Big5. De lo contrario, para algunos fines, puede detenerse aquí y considerar que el archivo es binario. Sin embargo, aún puede ser texto en una codificación de 16 o 32 bits.

Si un archivo no cumple con las restricciones anteriores, examine los primeros 2-4 bytes del archivo para una marca de orden de bytes :

  • Si los primeros dos bytes son hex FE FF , el archivo es tentativamente UTF-16 BE.
  • Si los primeros dos bytes son FF FE hexadecimales, y los siguientes dos bytes no son hexadecimales 00 00 , el archivo es tentativamente UTF-16 LE.
  • Si los primeros cuatro bytes son hexadecimales 00 00 FE FF , el archivo es tentativamente UTF-32 BE.
  • Si los primeros cuatro bytes son hex FF FE 00 00 , el archivo es tentativamente UTF-32 LE.

Si, a través de las comprobaciones anteriores, ha determinado una codificación tentativa, luego verifique solo la codificación correspondiente a continuación, para asegurarse de que el archivo no sea binario y coincida con una marca de orden de bytes.

Si no ha determinado una codificación tentativa, el archivo puede seguir siendo un archivo de texto en una de estas codificaciones, ya que la marca de orden de bytes no es obligatoria, por lo que debe verificar todas las codificaciones en la siguiente lista:

  • Si el archivo contiene solo palabras de dos bytes big-endian con los valores decimales 9-13, 32-126 y 128 o superior, el archivo probablemente sea UTF-16 BE.
  • Si el archivo contiene solo palabras little-endian de dos bytes con los valores decimales 9-13, 32-126 y 128 o superior, el archivo probablemente sea UTF-16 LE.
  • Si el archivo contiene solo palabras de cuatro bytes big-endian con los valores decimales 9-13, 32-126 y 128 o superior, el archivo probablemente sea UTF-32 BE.
  • Si el archivo contiene solo palabras de cuatro bytes little-endian con los valores decimales 9-13, 32-126 y 128 o superior, el archivo probablemente sea UTF-32 LE.

Si, después de todas estas comprobaciones, aún no ha determinado una codificación, el archivo no es un archivo de texto en ninguna codificación basada en ASCII que conozca, por lo que para la mayoría de los propósitos, probablemente pueda considerarlo binario (aún podría serlo). ser un archivo de texto en una codificación no ASCII como EBCDIC, pero sospecho que está fuera del alcance de su preocupación).


Usted itera a través de él usando un bucle normal con stream.get (), y verifica si los valores de byte que lee son <= 127 . Una forma de muchas maneras de hacerlo:

int c; std::ifstream a("file.txt"); while((c = a.get()) != EOF && c <= 127) ; if(c == EOF) { /* file is all ASCII */ }

Sin embargo, como alguien mencionó, todos los archivos son archivos binarios después de todo. Además, no está claro a qué te refieres con "ascii". Si te refieres al código del personaje, entonces esta es la forma en que vas. Pero si solo quieres decir valores alfanuméricos, necesitarías otro camino por recorrer.