AnteriorPosterior

Tema 5 - Ficheros binarios desde C++

  Curso: C++ para gente que conoce C

5. Ficheros desde C++ (2)

Hemos visto lo básico del manejo de ficheros de texto, pero también es frecuente tener que manejar ficheros "binarios", que contengan cualquier tipo de información, estructurada o no.

Tendremos funciones para saltar a una cierta posición, para saber en qué posición del fichero nos encontramos, para guardar todo un bloque de datos o para leer todo un bloque de datos.

Primero vamos a resumirlas y luego veremos un ejemplo de su uso:
  • Para saltar una una cierta posición usaremos "seekg" si el fichero es de lectura ("seek" = buscar, g = abreviatura de "get", lectura) o bien "seekp" si el fichero es de escritura (la "p" proviene de "put").
En estos saltos deberemos indicar la cantidad de espacio que queremos saltar, y desde qué punto (el principio del fichero se indica como "ios::beg", la posición actual como "ios::cur", y el final como "ios::end"), así:

fichero.seekg(10, ios::cur); // Saltar 10 bytes
fichero.seekg(0, ios::beg); // Volver al principio
fichero.seekg(0, ios::end); // Ir al final del fichero


  • Para saber en qué posición estamos usaremos "tellg" (para lectura de ficheros) o "tellp" (para escritura en fichero). Si lo hacemos cuando estamos al final del fichero, podremos saber cual es la longitud en bytes de dicho fichero:
fichero.seekg(0, ios::end); // Ir al final del fichero
tamanyo = fichero.tellg(); // Ver posicion para saber tamaño


  • Para leer un bloque de información usaremos "fichero.read(bloque, tamaño);" y para escribir un bloque "fichero.write(bloque, tamaño);".

Vamos a ver un ejemplo que compruebe si existe información almacenada en un fichero MP3 (lo que se conoce como el "Id3 tag", y que puede contener autor, canción, álbum...) :

#include <iostream>
#include <fstream>
 
using namespace std;
 
int main () {

    fstream ficheroMp3;
    char marca[3];
 
    ficheroMp3.open ("ejemplo.mp3", ios::in | ios::binary);
    // Compruebo si he podido abrir

    if (ficheroMp3.is_open()) {
        // Me coloco donde empieza el ID3 TAG
        ficheroMp3.seekg(-128, ios::end);
        // Leo 3 bytes

        ficheroMp3.read(marca, 3);
        // Digo si day datos o no
        if ((marca[0] != 'T') || (marca[1] != 'A') || (marca[2] != 'G'))

            cout << "Sin datos de artista" << endl;
        else
            cout << "Parece un MP3 con ID3 TAG" << endl;
        // Finalmente, cierro

        ficheroMp3.close();
    }
    // Si no he podido abrir, aviso
    else cout << "Fichero inexistente" << endl;
    return 0;

}
 

Actualizado el: 10-12-2009 13:16

AnteriorPosterior