¿Qué significa lo siguiente en C++? 1. ios::out 2. ios::in 3. ios::app 4. ios::binary etc.?

Intro: La operación que se realiza sobre un objeto para asociarlo a un archivo real se conoce como abrir un archivo. Un archivo abierto está representado dentro de un programa por un stream (es decir, un objeto de una de estas clases) y cualquier operación de entrada o salida que se realice sobre este objeto stream se aplicará al fichero físico asociado a él.

Para abrir un fichero con un objeto stream utilizamos su función miembro open:

open (filename, mode);

Donde filename es una cadena que representa el nombre del fichero a abrir, y mode es un parámetro opcional con una combinación de los siguientes flags:

  • ios::in Open para operaciones de entrada.
  • ios::out Abrir para operaciones de salida.
  • ios::binary Abrir en modo binario.
  • ios::ate Establecer la posición inicial al final del archivo. (Si no se establece esta bandera, la posición inicial es el principio del archivo.)
  • ios::app Todas las operaciones de salida se realizan al final del archivo, añadiendo el contenido al contenido actual del archivo.
  • ios::trunc Si el archivo se abre para operaciones de salida y ya existía, su contenido anterior se borra y se sustituye por el nuevo.

Todas estas banderas pueden combinarse utilizando el operador OR (|) a nivel de bits. For example, if we want to open the file example.bin in binary mode to add data we could do it by the following call to member function open:

  1. ofstream myfile;  
  2. myfile.open ("example.bin", ios::out | ios::app | ios::binary); 

Each of the open member functions of classes ofstream, ifstream and fstream has a default mode that is used if the file is opened without a second argument:

class default mode parameter
ofstream ios::out
ifstream ios::in
fstream ios::in | ios::out

Para las clases ifstream y ofstream, se asumen automática y respectivamente ios::in y ios::out, aunque se pase un modo que no los incluya como segundo argumento a la función miembro open (los flags se combinan).

Para fstream, el valor por defecto sólo se aplica si la función se llama sin especificar ningún valor para el parámetro mode. Si la función se llama con cualquier valor en ese parámetro, el modo por defecto se anula, no se combina.

Los flujos de archivos abiertos en modo binario realizan operaciones de entrada y salida independientemente de cualquier consideración de formato. Los archivos no binarios se conocen como archivos de texto, y pueden producirse algunas traducciones debido al formato de algunos caracteres especiales (como los caracteres de nueva línea y retorno de carro).

Dado que la primera tarea que se realiza en un flujo de archivos es generalmente abrir un archivo, estas tres clases incluyen un constructor que llama automáticamente a la función miembro open y tiene exactamente los mismos parámetros que este miembro. Por lo tanto, también podríamos haber declarado el objeto myfile anterior y realizar la misma operación de apertura en nuestro ejemplo anterior escribiendo:

ofstream myfile ("ejemplo.bin", ios::out | ios::app | ios::binary);

Combinando la construcción del objeto y la apertura del stream en una sola sentencia. Ambas formas de abrir un archivo son válidas y equivalentes. Para comprobar si un flujo de archivos se abrió con éxito, puede hacerlo llamando al miembro is_open. Esta función miembro devuelve un valor bool de true en el caso de que efectivamente el objeto stream esté asociado a un archivo abierto, o false en caso contrario:

if (myfile.is_open()) { /* ok, proceder con la salida */ }