2012-09-11 22 views
14

Para realizar el archivo IO en C++ utilizamos las clases ofstream, ifstream y fstream.Modalidad abierta de archivos C++ ambigüedad

  • ofstream: clase Stream para escribir en archivos
  • ifstream: clase de secuencia para leer de archivos
  • fstream: clase Stream para leer y escribir desde/a archivos

El El proceso de asociar un archivo con un objeto de flujo se denomina "abrir el archivo". Al abrir un archivo, podemos especificar el modo en que se abrirá el archivo. Mi consulta está relacionada con los modos ios::out y ios:in.

Cuando creo un objeto ofstream y abrir el archivo con ios::in modo, yo soy capaz de de escritura en el archivo, pero sólo si su ya creado (con ios::out archivo modo también se crea si no existe ya).
Pero cuando creo el objeto ifstream y abro el archivo con el modo ios::out, puedo leer el archivo.

Mi pregunta es por qué estos modos (ios::in/ios::out) son suministrados por la lengua cuando el tipo de la corriente (ifstream/ofstream) determine por sí mismo en cuanto a qué tipo de operación (entrada/salida) se está realizando?

También por qué este uso ambiguo (ofstream con ios::in y ifstream con ios::out) trabaja en un caso y no (aunque sólo si el archivo no está ya presente) en otro?

Respuesta

11

Los ofstream, ifstream y fstream clases son interfaces de alto nivel para el subordinado filebuf, que se puede obtener a través de la función rdbuf() miembro de la corriente.

Según el estándar cuando abre un ofstream con algún modo mode, abre el búfer de secuencia de subrayado como con mode | ios_base::out. Análogamente ifstream usa mode | ios_base::in. fstream pasa el parámetro mode literal al búfer de secuencia subrayada.

Lo anterior implica es que el código siguiente abre el archivo con exactamente las mismas banderas abiertas:

fstream f("a.txt", ios_base::in | ios_base::out); 
ifstream g("a.txt", ios_base::out); 
ofstream h("a.txt", ios_base::in); 

Después de estas líneas se puede hacer exactamente las mismas cosas con f.rdbuf(), g.rdbuf() y h.rdbuf(), y todo el tres actúan como si hubiera abierto el archivo con la llamada C fopen("a.txt", "r+"), que le da acceso de lectura/escritura, no trunca el archivo y falla si el archivo no existe.

Entonces, ¿por qué tenemos tres clases diferentes? Como ya he dicho, estas son clases de alto nivel que proporcionan una interfaz de alto nivel sobre el buffer de flujo de nivel más bajo. La idea es que ifstream tiene funciones de miembro para la entrada (como read()), ofstream tiene funciones de miembro para la salida (como write()), mientras que fstream tiene ambas. Por ejemplo, usted no puede hacer esto:

g.write("abc", 3); // error: g does not have a write function 

Pero esto funciona, porque, aunque es un gifstream, habíamos abierto con ios_base::out:

g.rdbuf()->sputn("abc", 3); // we still have write access 
0

Porque el modo no está limitado a la entrada/salida. El constructor de ifstream, por ejemplo, se ve como:

explicit ifstream (const char * filename, ios_base::openmode mode = ios_base::in); 

Nota El valor predeterminado es ios_base::in, por lo que no tiene que especificar usted mismo. Sin embargo, el mode establece los indicadores de corrientes que son no limita a in/out, pero incluyen:

  • app (Añadir) Establecer indicador de posición de la corriente hasta el final de la corriente antes de cada operación de salida.
  • ate (al final) Establezca el indicador de posición de la secuencia hasta el final de la secuencia al abrir.
  • binary (binario) Considere la transmisión como binario en lugar de texto.
  • in (entrada) Permiten operaciones de entrada en la transmisión.
  • out (salida) Permitir operaciones de salida en la secuencia.
  • trunc (truncar) Cualquier contenido actual se descarta, asumiendo una longitud de cero en la apertura.
Cuestiones relacionadas