Archivos en C++

Los archivos son una parte fundamental de cualquier programa, ya que permiten almacenar y recuperar datos de forma permanente. En C++, la gestión de archivos se realiza mediante la biblioteca fstream, que nos proporciona las herramientas necesarias para trabajar con flujos de entrada y salida.

En este artículo, exploraremos en detalle el manejo de archivos en C++, desde la apertura y cierre de archivos hasta la lectura y escritura de datos. Además, abordaremos temas más avanzados como la búsqueda en archivos y el uso de punteros de archivo.

Abrir y cerrar archivos

Lo primero que debemos hacer para trabajar con un archivo es abrirlo. Para ello, utilizamos la clase ifstream para archivos de entrada y ofstream para archivos de salida. La siguiente sintaxis nos muestra cómo abrir un archivo de texto llamado «ejemplo.txt» para lectura:


ifstream archivo("ejemplo.txt");

Lenguaje del código: C++ (cpp)

Si el archivo no existe, se generará un error. Es importante verificar si la apertura del archivo fue exitosa utilizando la función is_open():


if (archivo.is_open()) {
  // El archivo se abrió correctamente
} else {
  // Error al abrir el archivo
}

Lenguaje del código: C++ (cpp)

Una vez que terminamos de trabajar con el archivo, debemos cerrarlo para liberar los recursos del sistema. Se realiza con la función close():


archivo.close();

Lenguaje del código: C++ (cpp)

Lectura y escritura de datos

La lectura y escritura de datos en archivos se realiza mediante los métodos get() y put(), respectivamente. El método get() extrae un carácter del archivo y lo devuelve como un valor int. El método put() escribe un carácter en el archivo.

Para leer una línea completa del archivo, podemos utilizar la función getline():


std::string linea;
getline(archivo, linea);

Lenguaje del código: C++ (cpp)

La función getline() lee caracteres del archivo hasta que encuentra un salto de línea (\n). La línea leída se guarda en la variable linea.

Para escribir una línea en el archivo, podemos utilizar el operador <<:


archivo << "Esta es una línea escrita en el archivo" << std::endl;

Lenguaje del código: C++ (cpp)

El operador << inserta el contenido entre comillas dobles en el archivo. La función std::endl agrega un salto de línea al final de la línea.

Búsqueda en archivos

La biblioteca fstream nos proporciona la función seekg() para buscar una posición específica dentro del archivo. La función seekg() toma dos argumentos:

  • La posición a buscar, que puede ser un valor absoluto o relativo al inicio o final del archivo.
  • Un modo de búsqueda, que puede ser ios::beg para buscar desde el inicio, ios::cur para buscar desde la posición actual o ios::end para buscar desde el final del archivo.

El siguiente código muestra cómo buscar la primera aparición de la palabra «ejemplo» en el archivo:


archivo.seekg(0, ios::beg);
std::string palabra;
while (archivo >> palabra) {
  if (palabra == "ejemplo") {
    // Se encontró la palabra
  }
}

Lenguaje del código: C++ (cpp)

Punteros de archivo

Los punteros de archivo nos permiten acceder a cualquier posición del archivo de forma directa. La clase fstream proporciona el tipo fstream::pos_type para representar la posición actual del archivo.

Para obtener la posición actual del archivo, podemos utilizar la función tellg():


fstream::pos_type posicion = archivo.tellg();

Lenguaje del código: C++ (cpp)

Para mover el puntero de archivo a una posición específica, podemos utilizar la función seekg():


archivo.seekg(posicion);

Lenguaje del código: C++ (cpp)

El uso de punteros de archivo nos da mayor flexibilidad al trabajar con archivos, ya que podemos acceder a cualquier dato sin necesidad de leer todo el archivo.

Ejemplos prácticos

Para complementar la información teórica, te presentamos algunos ejemplos prácticos de cómo trabajar con archivos en C++:

Ejemplo 1: Leer un archivo de texto y mostrar su contenido


#<strong>include</strong> <fstream>
#<strong>include</strong> <iostream>

int main() {
  std::ifstream archivo("ejemplo.txt");

  if (archivo.is_open()) {
    std::string linea;
    while (getline(archivo, linea)) {
      std::cout << linea << std::endl;
    }
    archivo.close();
  } else {
    std::cout << "Error al abrir el archivo" << std::endl;
  }

  return 0;
}

Lenguaje del código: C++ (cpp)

Ejemplo 2: Escribir un archivo de texto con datos del usuario


#<strong>include</strong> <fstream>
#<strong>include</strong> <iostream>

int main() {
  std::ofstream archivo("datos.txt");

  if (archivo.is_open()) {
    std::string nombre, apellido;
    int edad;

    std::cout << "Ingrese su nombre: ";
    std::cin >> nombre;

    std::cout << "Ingrese su apellido: ";
    std::cin >> apellido;

    std::cout << "Ingrese su edad: ";
    std::cin >> edad;

    archivo << nombre << " " << apellido << " " << edad << std::endl;
    archivo.close();

    std::cout << "Se han guardado los datos en el archivo datos.txt" << std::endl;
  } else {
    std::cout << "Error al abrir el archivo" << std::endl;
  }

  return 0;
}

Lenguaje del código: C++ (cpp)

Ejemplo 3: Buscar una palabra en un archivo de texto


#<strong>include</strong> <fstream>
#<strong>include</strong> <iostream>

int main() {
  std::ifstream archivo("ejemplo.txt");

  if (archivo.is_open()) {
    std::string palabra;

    std::cout << "Ingrese la palabra a buscar: ";
    std::cin >> palabra;

    archivo.seekg(0, ios::beg);
    bool encontrado = false;
    while (archivo >> palabra) {
      if (palabra == palabraBuscada) {
        encontrado = true;
        break;
      }
    }

    if (encontrado) {
      std::cout << "La palabra " << palabra << " se encontró en el archivo" << std::endl;
    } else {
      std::cout << "La palabra " << palabra << " no se encontró en el archivo" << std::endl;
    }

    archivo.close();
  } else {
    std::cout << "Error al abrir el archivo" << std::endl;
  }

  return 0;
}

Lenguaje del código: C++ (cpp)

Estos ejemplos te permiten familiarizarte con las operaciones básicas de lectura y escritura de archivos en C++. Puedes modificarlos y adaptarlos a tus necesidades para crear programas más complejos.