Archivos y secuencias de C ++

Hasta ahora, hemos estado usando iostream biblioteca estándar, que proporciona cin y cout métodos para leer de entrada estándar y escribir a salida estándar respectivamente.

Este tutorial le enseñará cómo leer y escribir desde un archivo. Esto requiere otra biblioteca C ++ estándar llamadafstream, que define tres nuevos tipos de datos:

No Señor Tipo de datos y descripción
1

ofstream

Este tipo de datos representa el flujo del archivo de salida y se utiliza para crear archivos y escribir información en archivos.

2

ifstream

Este tipo de datos representa el flujo de archivos de entrada y se utiliza para leer información de archivos.

3

fstream

Este tipo de datos representa el flujo de archivos en general y tiene las capacidades de ofstream e ifstream, lo que significa que puede crear archivos, escribir información en archivos y leer información de archivos.

Para realizar el procesamiento de archivos en C ++, los archivos de encabezado <iostream> y <fstream> deben incluirse en su archivo fuente de C ++.

Abrir un archivo

Se debe abrir un archivo antes de poder leerlo o escribir en él. Ya seaofstream o fstreamEl objeto se puede utilizar para abrir un archivo y escribirlo. Y el objeto ifstream se usa para abrir un archivo solo con fines de lectura.

A continuación se muestra la sintaxis estándar para la función open (), que es miembro de los objetos fstream, ifstream y ofstream.

void open(const char *filename, ios::openmode mode);

Aquí, el primer argumento especifica el nombre y la ubicación del archivo que se abrirá y el segundo argumento del open() La función miembro define el modo en el que se debe abrir el archivo.

No Señor Indicador de modo y descripción
1

ios::app

Modo anexar. Toda la salida a ese archivo se adjuntará al final.

2

ios::ate

Abra un archivo para la salida y mueva el control de lectura / escritura al final del archivo.

3

ios::in

Abra un archivo para leerlo.

4

ios::out

Abra un archivo para escribir.

5

ios::trunc

Si el archivo ya existe, su contenido se truncará antes de abrirlo.

Puede combinar dos o más de estos valores por ORponiéndolos juntos. Por ejemplo, si desea abrir un archivo en modo escritura y desea truncarlo en caso de que ya exista, la siguiente será la sintaxis:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

De manera similar, puede abrir un archivo con fines de lectura y escritura de la siguiente manera:

fstream  afile;
afile.open("file.dat", ios::out | ios::in );

Cerrar un archivo

Cuando un programa C ++ termina, automáticamente vacía todos los flujos, libera toda la memoria asignada y cierra todos los archivos abiertos. Pero siempre es una buena práctica que un programador cierre todos los archivos abiertos antes de que finalice el programa.

A continuación se muestra la sintaxis estándar para la función close (), que es miembro de los objetos fstream, ifstream y ofstream.

void close();

Escribir en un archivo

Mientras realiza la programación en C ++, escribe información en un archivo desde su programa usando el operador de inserción de flujo (<<) al igual que usa ese operador para enviar información a la pantalla. La única diferencia es que usa unofstream o fstream objeto en lugar del cout objeto.

Leer de un archivo

Usted lee información de un archivo en su programa usando el operador de extracción de flujo (>>) al igual que usa ese operador para ingresar información desde el teclado. La única diferencia es que usa unifstream o fstream objeto en lugar del cin objeto.

Ejemplo de lectura y escritura

A continuación se muestra el programa C ++ que abre un archivo en modo de lectura y escritura. Después de escribir la información ingresada por el usuario en un archivo llamado afile.dat, el programa lee la información del archivo y la muestra en la pantalla.

#include <fstream>
#include <iostream>
using namespace std;
 
int main () {
   char data[100];

   // open a file in write mode.
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);

   // write inputted data into the file.
   outfile << data << endl;

   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // again write inputted data into the file.
   outfile << data << endl;

   // close the opened file.
   outfile.close();

   // open a file in read mode.
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 

   // write the data at the screen.
   cout << data << endl;
   
   // again read the data from the file and display it.
   infile >> data; 
   cout << data << endl; 

   // close the opened file.
   infile.close();

   return 0;
}

Cuando el código anterior se compila y ejecuta, produce la siguiente entrada y salida de muestra:

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

Los ejemplos anteriores hacen uso de funciones adicionales del objeto cin, como la función getline () para leer la línea desde el exterior y la función ignore () para ignorar los caracteres adicionales que dejó la declaración de lectura anterior.

Punteros de posición de archivo

Ambos istream y ostreamproporcionan funciones miembro para reposicionar el puntero de posición de archivo. Estas funciones miembro sonseekg ("seek get") para istream y seekp ("buscar poner") para ostream.

El argumento de seekg y seekp normalmente es un entero largo. Se puede especificar un segundo argumento para indicar la dirección de búsqueda. La dirección de búsqueda puede serios::beg (el valor predeterminado) para el posicionamiento relativo al comienzo de una secuencia, ios::cur para el posicionamiento relativo a la posición actual en una secuencia o ios::end para el posicionamiento relativo al final de una secuencia.

El puntero de posición de archivo es un valor entero que especifica la ubicación en el archivo como un número de bytes desde la ubicación inicial del archivo. Algunos ejemplos de colocación del puntero de posición de archivo "get" son:

// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );

// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );

// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );

// position at end of fileObject
fileObject.seekg( 0, ios::end );