AnteriorPosterior

8. Ficheros (1: de texto)

Por: Nacho Cabanes
Actualizado: 20-04-2019 10:19
Tiempo de lectura estimado: 8 min.

 

C++

8. Ficheros

8.1. Escritura en un fichero de texto

Para manejar ficheros, siempre deberemos realizar tres operaciones básicas:

  • Abrir el fichero.
  • Leer datos de él o escribir datos en él.
  • Cerrar el fichero.

Además tendremos que comprobar los posibles errores. Por ejemplo, puede ocurrir que intentemos abrir un fichero que realmente no exista, o que queramos escribir en un dispositivo que sea sólo de lectura.

Vamos a ver un ejemplo, que cree un fichero de texto y escriba algo en él:

// Introducción a C++, Nacho Cabanes
// Ejemplo 08.01:
// Escritura en un fichero de texto
 
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    ofstream fichero("prueba.txt");
    fichero << "Esto es una línea" << endl;
    fichero << "Esto es otra";
    fichero << " y esto es continuación de la anterior" << endl;
    fichero.close();
 
    return 0;
}

Hay varias cosas que comentar sobre este programa:

  • Deberemos incluir "fstream" para poder usar los "flujos de datos de ficheros" (cuyo manejo será muy parecido al de la consola, en la que escribíamos con "cout" y leíamos con "cin".
  • Un fichero de escritura será un "ofstream", abreviatura de "output file stream". En su uso más básico, bastará con indicar el nombre que tendrá el fichero dentro de nuestro programa (por ejemplo "fichero") y, entre paréntesis y comillas, el nombre físico que tendrá en nuestro disco o dispositivo de almacenamiento que estemos usando (por ejemplo, "prueba.txt").
  • Para escribir datos en el fichero usando "<<", de forma muy similar a como usábamos "cout" para enviar texto a pantalla.
  • Finalmente, debemos cerrar el fichero con ".close()".

Ejercicios propuestos:

  • (8.1.1) Crea un programa que vaya leyendo las palabras que el usuario teclee y las guarde en un fichero de texto llamado “registroDeUsuario.txt”. Terminará cuando la palabras introducida sea "fin" (esa frase no deberá guardarse en el fichero).

8.2. Lectura de un fichero de texto

Si queremos leer de un fichero, los pasos son muy parecidos, excepto que el fichero será un "ifstream" (input file stream) y que leeremos con ">>", de forma parecida a como leíamos desde teclado:

// Introducción a C++, Nacho Cabanes
// Ejemplo 08.02: 
// Lectura de una palabra de un fichero de texto
 
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    ifstream fichero("prueba.txt");
    string linea;
 
    fichero >> linea;
 
    cout << "Se ha leido: " << endl;
    cout << linea << endl;
 
    fichero.close();
 
    return 0;
}

Ejercicios propuestos:

  • (8.2.1) Crea un programa que muestre las tres primeras palabras que contenga un fichero de texto.

8.3. Leer toda una línea, incluyendo espacios

Hasta ahora, hemos leído datos con "cin", pero cuando se trataba de texto, la lectura terminaba en el primer espacio. La alternativa es leer con "getline", que se puede aplicar tanto a "cin" como a un fichero: "getline(cin, texto);", de modo que un programa que pida al usuario el nombre de un fichero y muestre su primera línea completa sería así:

// Introducción a C++, Nacho Cabanes
// Ejemplo 08.03: 
// Lectura de una frase de un fichero de texto
 
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    cout << "Dime el nombre del fichero: ";
    string nombre;
    getline(cin, nombre);
 
    ifstream fichero(nombre.c_str());
    string linea;
 
    getline(fichero,linea);
    cout << "Se ha leido: " << endl;
    cout << linea << endl;
 
    fichero.close();
 
    return 0;
}

La única complicación adicional es que cuando abrimos el fichero "ifstream", se da por sentado que el primer dato es una cadena "al estilo de C", no un string. No es un problema si es un nombre prefijado, como ocurría en los dos ejemplos anteriores, pero sí es un poco más desconcertando cuando el nombre no es fijo, como en este caso. Pero basta con obtener una cadena "al estilo de C" a partir del string introducido por el usuario: "ifstream fichero(nombre.c_str());"

Ejercicios propuestos:

  • (8.3.1) Crea un programa que muestre las tres primeras líneas que contenga un fichero de texto, cuyo nombre deberá introducir el usuario.

8.4. Lectura hasta el final del fichero

Normalmente no querremos leer sólo una frase del fichero, sino procesar todo su contenido. Para ayudarnos, tenemos una forma de saber si ya hemos llegado al final del fichero. Es “.eof()”, que será verdadero si el fichero ha terminado (EOF es la abreviatura de End Of File, fin de fichero).

De igual modo, podemos comprobar si ha habido algún error (por ejemplo, hemos intentado abrir un fichero que no existe) usando ".fail()".

Por tanto, nuestro programa que avise si el fichero no existe y que muestre todo su contenido, deberá repetirse mientras que no se acabe el fichero, así:

// Introducción a C++, Nacho Cabanes
// Ejemplo 08.04:
// Lectura hasta el final de un fichero de texto
 
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
 
int main()
{
    string nombre;
    string linea;
 
    cout << "Dime el nombre del fichero: ";    
    getline(cin, nombre);
 
    ifstream fichero(nombre.c_str());
    if( fichero.fail() )
    {
        cout << "No existe el fichero!" << endl;
        exit(1);
    }
 
    while (! fichero.eof()) 
    {
        getline(fichero,linea);
        if (! fichero.eof()) 
            cout << linea << endl;
    }
    fichero.close();
 
    return 0;
}

Esa será la estructura básica de casi cualquier programa que deba leer un fichero completo, de principio a fin: abrir, comprobar que se ha podido acceder correctamente, leer con “while ( !fichero.eof())” y cerrar.

Ejercicios propuestos:

  • (8.4.1) Un programa que pida al usuario que teclee frases, y las almacene en el fichero “frases.txt”. Acabará cuando el usuario pulse Intro sin teclear nada. Después deberá mostrar el contenido del fichero.
  • (8.4.2) Un programa que pregunte un nombre de fichero y muestre en pantalla el contenido de ese fichero, haciendo una pausa después de cada 25 líneas, para que dé tiempo a leerlo. Cuando el usuario pulse intro, se mostrarán las siguientes 25 líneas, y así hasta que termine el fichero.

959 visitas desde el 20-04-2019

AnteriorPosterior