Cómo marcar las banderas ios en C ++

Al abrir un archivo mediante la construcción o bien un ofstream o ifstream ejemplo, usted puede modificar la forma en que el archivo se abrirá mediante el suministro de lo que se llaman las banderas. En términos informáticos, un bandera es simplemente un objeto pequeño cuya presencia o falta de presencia indica una función de cómo hacer algo. Con el ofstream y ifstream clases, la función en cuestión es el constructor.

Una bandera se parece ios :: aplicación si usted está utilizando un compilador que no es totalmente compatible con ANSI, o parece ios_base :: aplicación si usted está utilizando una que es totalmente compatible con ANSI. Esta bandera particular, significa que usted quiere escribir en un archivo, pero desea anexar a los datos existentes que ya puede estar en un archivo. Usted provee esta bandera como argumento del constructor para ofstream, como en cualquiera de los siguientes ejemplos:

ofstream archivosalida ("AppendableFile.txt", ios :: app) -ofstream archivosalida ("AppendableFile.txt", ios_base :: app) -

Se puede ver que la bandera se añade como segundo parámetro al constructor. Existen otras banderas, además de aplicación, y se pueden combinar con la o operador, |. Por ejemplo, una bandera es ios :: nocreate (que no está incluido en los nuevos compiladores).

Éste significa “, y sólo abrir el archivo si ya existe ". Es decir, no cree el archivo si no existe. (Recuerda, ofstream crea un archivo si no existe ya). Si no existe el archivo, el open fallará, y cuando llame fallar, obtendrá una vuelta cierto.

los ios :: nocreate bandera es hábil con ios :: aplicación. Juntos, estos significan abrir un archivo existente y añadir a ella. Es decir, los dos juntos sólo funcionará si el archivo ya existe, y la llamada se abrirá el archivo para una operación de anexión. Si el archivo no existe, no se creará el archivo. He aquí un ejemplo de llamada:

ofstream archivosalida ("../ MyFile.txt", ios :: aplicación | ios :: nocreate) -si (outfile.fail ()) {cout lt; lt; "No se pudo abrir el archivo!" lt; lt; endl retorno 0-} archivosalida lt; lt; "Hola" lt; lt; endl-outfile.close () -

Si MyFile.txt no existe cuando se ejecuta este código, se obtiene el mensaje No se pudo abrir el archivo! Pero si MyFile.txt existe, la aplicación abre, añade la cadena Hola a ella, y finalmente cierra.

Resulta que el nocreate bandera no está disponible en la nueva biblioteca estándar. Charlatán. Por lo tanto, el código sólo funciona si usted está utilizando una versión anterior de la biblioteca. Cuando se utiliza el compilador de Code :: Blocks, aparece el siguiente mensaje de error:

error: "nocreate 'no es miembro de' -std :: ios '

Sin embargo, usted querrá comprobar si su compilador particular incluye una biblioteca que soporta ios :: nocreate. Su compilador puede apoyar todos modos, incluso si se incluye la nueva biblioteca estándar. Como una alternativa a ios :: nocreate, puede utilizar el siguiente código (que se encuentra en el FileOutput02 ejemplo):

infile ifstream ("MyFile.txt ../") - si (infile.fail ()) {cout lt; lt; "No se pudo abrir el archivo!" lt; lt; endl retorno 0-} infile.close () - archivosalida ofstream ("../ MyFile.txt", ios :: app) -outfile lt; lt; "Hola" lt; lt; endl-outfile.close () -

En este caso, se empieza por intentar abrir el archivo para lectura. Si no existe el archivo, no se puede leer de él y el código sale con un mensaje de fallo. Si el código se puede leer el archivo, se vuelve a abrir el archivo para escritura. Esta es una solución engorroso, pero funciona.

A continuación se presenta una lista de las banderas disponibles. En primer lugar, aquí son los de ios, en caso de que estés usando un compilador que no es completamente compatible con ANSI:

  • ios :: aplicación: Este indicador significa que usted desea abrir un archivo y anexar a la misma.

  • ios :: enIncluya esta opción si desea leer desde un archivo.

  • ios :: cabo: Incluir este indicador si desea escribir en un archivo.

  • ios :: trunc: Incluir este indicador si desea eliminar el contenido del archivo antes de escribir en él. Es lo contrario de anexar, y también es el valor predeterminado si no se incluye específicamente ios :: aplicación.

  • ios :: nocreate: Utilice esta opción si desea asegurarse de que el archivo no se creará si no existe, lo que resulta en el archivo no se abra.

  • ios :: noreplace: Esta bandera es lo contrario de nocreate. Utilice esta opción si sólo desea crear un nuevo archivo. Si usa esta bandera y ya existe el archivo, el archivo no se abre, y que el no volverá cierto.

Compiladores ANSI cumplen no son compatibles con el ios :: noreplace flag tampoco. En este caso, puede utilizar el opuesto de la solución para el ios: nocreate bandera, como se muestra aquí (y se encontró en el FileOutput03 ejemplo):

infile ifstream ("MyFile.txt ../") - si {cout (infile.fail ()!) lt; lt; "El archivo ya existe!" lt; lt; endl retorno 0-} infile.close () - archivosalida ofstream ("../ MyFile.txt") - archivosalida lt; lt; "Hola" lt; lt; endl-outfile.close () -

En este caso, el código intenta abrir el archivo para lectura. Si existe el archivo, el código muestra un mensaje de error y se cierra. De lo contrario, el código crea un nuevo archivo y escribe en ella.

Los indicadores siguientes están disponibles en un compilador que es absolutamente compatible con ANSI!

  • ios :: comió: Utilice esta opción para ir al final del archivo después de abrirlo. Normalmente, se utiliza este indicador cuando se quiere añadir datos al archivo.

  • ios_base :: binaria: Utilice esta opción para especificar que el archivo que está abriendo celebrará datos binarios - es decir, los datos que no representa cadenas de caracteres.

  • ios_base :: en: Especifique esta bandera cuando quieres leer desde un archivo.

  • ios_base :: caboIncluya esta bandera cuando se quiere escribir en un archivo.

  • ios_base :: trunc: Integrar este indicador si desea eliminar el contenido de un archivo antes de escribir en él.

  • ios_base :: aplicaciónIncluya esta opción si desea anexar al archivo. Es lo contrario de trunc - es decir, la información que ya está en el archivo al abrirlo se quedará allí.

¿Por qué necesita una en la bandera y un fuera bandera? Parece que el equipo debe saber si usted está escribiendo en un archivo o la lectura de la misma, en función (respectivamente) de si se utiliza ofstream o ifstream. La respuesta a por qué usted tiene una en bandera y un fuera bandera es que otras clases están disponibles además ofstream y ifstream.

Los compiladores que aún no apoyan plenamente la norma ANSI tienen una clase genérica en sus bibliotecas llamada fstream. Los compiladores ANSI cumplen tienen en sus bibliotecas una clase de plantilla llamada basic_filebuf y una clase llamada filebuf. Si utiliza estas clases, se puede utilizar el en y fuera banderas.




» » » » Cómo marcar las banderas ios en C ++