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
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
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