Dominando Entrada/Salida de Archivos en C++: Lectura y Escritura con fstream
Hasta ahora, hemos estado usando la biblioteca estándar iostream, que proporciona los métodos cin y cout para leer de la entrada estándar y escribir a la salida estándar respectivamente.
Este tutorial te enseñará cómo leer y escribir desde un archivo. Esto requiere otra biblioteca estándar de C++ llamada fstream, que define tres nuevos tipos de datos:
| Nº | Tipo de Dato y Descripción |
|---|---|
| 1 | ofstream Este tipo de dato representa el flujo de archivo de salida y se usa para crear archivos y escribir información en archivos. |
| 2 | ifstream Este tipo de dato representa el flujo de archivo de entrada y se usa para leer información de archivos. |
| 3 | fstream Este tipo de dato representa el flujo de archivo generalmente, y tiene las capacidades de tanto ofstream como ifstream, lo que significa que puede crear archivos, escribir información en archivos y leer información de archivos. |
Para realizar procesamiento de archivos en C++, los archivos de encabezado <iostream> y <fstream> deben ser incluidos en tu archivo fuente C++.
Abrir un Archivo
Un archivo debe ser abierto antes de que puedas leer de él o escribir en él. Ya sea un objeto ofstream o fstream puede ser usado para abrir un archivo para escritura. Y un objeto ifstream se usa para abrir un archivo solo para lectura.
La siguiente es la sintaxis estándar para la función open(), que es miembro de objetos fstream, ifstream y ofstream.
void open(const char *filename, ios::openmode mode);
Aquí, el primer argumento especifica el nombre y ubicación del archivo a abrir y el segundo argumento de la función miembro open() define el modo en que el archivo debe ser abierto.
| Nº | Bandera de Modo y Descripción |
|---|---|
| 1 | ios::app Modo anexar. Toda la salida a ese archivo se anexa al final. |
| 2 | ios::ate Abrir un archivo para salida y mover el control de lectura/escritura al final del archivo. |
| 3 | ios::in Abrir un archivo para lectura. |
| 4 | ios::out Abrir un archivo para escritura. |
| 5 | ios::trunc Si el archivo ya existe, su contenido será truncado antes de abrir el archivo. |
Puedes combinar dos o más de estos valores ORándolos juntos. Por ejemplo, si quieres abrir un archivo en modo escritura y quieres truncarlo en caso de que ya exista, la siguiente será la sintaxis:
ofstream outfile;
outfile.open("archivo.dat", ios::out | ios::trunc);
De manera similar, puedes abrir un archivo para lectura y escritura de la siguiente manera:
fstream afile;
afile.open("archivo.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 la terminación del programa.
La siguiente es la sintaxis estándar para la función close(), que es miembro de objetos fstream, ifstream y ofstream.
void close();
Escribir en un Archivo
Mientras haces programación en C++, escribes información en un archivo desde tu programa usando el operador de inserción de flujo (<<) tal como usas ese operador para mostrar información en la pantalla. La única diferencia es que usas un objeto ofstream o fstream en lugar del objeto cout.
Leer de un Archivo
Lees información de un archivo en tu programa usando el operador de extracción de flujo (>>) tal como usas ese operador para ingresar información desde el teclado. La única diferencia es que usas un objeto ifstream o fstream en lugar del objeto cin.
Ejemplo de Lectura y Escritura
El siguiente es el programa C++ que abre un archivo en modo 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 datos[100];
// abrir un archivo en modo escritura.
ofstream outfile;
outfile.open("afile.dat");
cout << "Escribiendo en el archivo" << endl;
cout << "Ingresa tu nombre: ";
cin.getline(datos, 100);
// escribir datos ingresados en el archivo.
outfile << datos << endl;
cout << "Ingresa tu edad: ";
cin >> datos;
cin.ignore();
// escribir nuevamente datos ingresados en el archivo.
outfile << datos << endl;
// cerrar el archivo abierto.
outfile.close();
// abrir un archivo en modo lectura.
ifstream infile;
infile.open("afile.dat");
cout << "Leyendo del archivo" << endl;
infile >> datos;
// escribir los datos en la pantalla.
cout << datos << endl;
// leer nuevamente los datos del archivo y mostrarlos.
infile >> datos;
cout << datos << endl;
// cerrar el archivo abierto.
infile.close();
return 0;
}
Cuando el código anterior se compila y ejecuta, produce la siguiente entrada y salida de ejemplo:
$./a.out
Escribiendo en el archivo
Ingresa tu nombre: Zara
Ingresa tu edad: 9
Leyendo del archivo
Zara
9
Los ejemplos anteriores hacen uso de funciones adicionales del objeto cin, como la función getline() para leer la línea desde fuera y la función ignore() para ignorar los caracteres extra dejados por la declaración de lectura anterior.
Punteros de Posición de Archivo
Tanto istream como ostream proporcionan funciones miembro para reposicionar el puntero de posición de archivo. Estas funciones miembro son seekg ("seek get") para istream y seekp ("seek put") para ostream.
El argumento para seekg y seekp normalmente es un entero largo. Un segundo argumento puede especificarse para indicar la dirección de búsqueda. La dirección de búsqueda puede ser ios::beg (el default) para posicionar relativo al inicio de un flujo, ios::cur para posicionar relativo a la posición actual en un flujo o ios::end para posicionar relativo al final de un flujo.
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 de inicio del archivo. Algunos ejemplos de posicionar el puntero de posición "get" son:
// posicionar al byte n-ésimo de fileObject (asume ios::beg)
fileObject.seekg(n);
// posicionar n bytes adelante en fileObject
fileObject.seekg(n, ios::cur);
// posicionar n bytes atrás desde el final de fileObject
fileObject.seekg(n, ios::end);
// posicionar al final de fileObject
fileObject.seekg(0, ios::end);
Lenguaje C
- ¿Qué es una Lima de Banco? Guía Completa de la Herramienta Esencial para Madera y Metal
- Estructuras vs Clases en C++: Guía práctica para desarrolladores embebidos
- Dominando Variables, Literales y Constantes en C++: Guía Completa
- Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
- Dominando la gestión de memoria en C++: uso experto de new y delete
- Funciones y clases amigas en C++: dominando el control de acceso
- Manejo de archivos en C: Dominando E/S con fopen, fprintf, fread y fseek
- Entendiendo los Archivos de Cabecera en C: Tipos, Uso y Buenas Prácticas
- Guía Completa de Fecha y Hora en C++
- Dominando la Sobrecarga en C++: Funciones y Operadores Explicados
- Dominando Operaciones de Directorios y Archivos en Python