| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Argone Lt


Registrado: 23 Jun 2003Mensajes: 97Ubicación: Las Palmas.. España
|
Publicado: Mar 25 Nov, 2003 2:10 pm Asunto: Leer de archivo numero de bits determinado |
|
|
Hola a todos..me gustaria poder leer de una archivo un numero de bits determinado. De momento se me ha ocurrido hacer lo siguiente:
| Código: |
FILE *Archivo;
TBits *Bits;
Archivo = fopen(FileName, "rb");
Bits = new TBits;
Bits->size = NumeroBitsaLeer;
fread(&Bits,sizeof(Bits),1,Archivo);
|
Hasta este pounto todo va perfecto..pero cuando intento extraer le contenido de cada bit me da error
bool Prueba = Bits->Bits[n];
Alguien sabe otra forma o lo que estoy haciendo mal. Muchas gracias
Argone |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 26 Nov, 2003 4:21 am Asunto: |
|
|
Cuando haces sizeof(Bits) fíjate que Bits es un puntero, por lo que el tamaño que te esta devolviendo es el del puntero. Otro detalle es cuando le pasas el puntero de una clase que ni sabes donde va a cargar los bytes que lees etc...
Puedes usar la siguiente clase para leer un archivo bit a bit y saber cuantos bits contiene. Solo funciona en modo lectura, aunque no costaría mucho que fuese también de escritura:
| Código: | #include <memory>
class TBitsFile
{
std::auto_ptr<TFileStream> fs;
public:
TBitsFile(String filename)
: fs(new TFileStream(filename, fmOpenRead)) { };
__int64 GetSize(void) { return fs->Size * 8; };
bool operator[](__int64 indice)
{
if (indice < GetSize())
{
fs->Position = indice / 8;
BYTE by;
fs->Read(&by, sizeof(by));
return (by >> (indice % 8)) & 1;
}
else
throw ERangeError("Fuera de rango.");
}
}; |
Para usarla:
| Código: | // Abrimos el archivo:
TBitsFile fbit("c:\\prueba.txt");
// Averiguamos cuantos bits contiene el archivo:
int numBits = fbit.GetSize();
// Leemos el bit 0:
bool bit0 = fbit[0];
|
Y el orden en que lee los bits:
| Código: | Suponiendo que tenemos un archivo
que contiene 3 bytes: "ABC"
|<-- C --|<-- B --| <- A --|
| 01000011 01000010 01000001
|--------|--------|--------|
| Bit16 Bit8 |
Bit23 << << << Bit0
|
Espero que te sirva. Saludos. |
|
| Volver arriba |
|
 |
Argone Lt


Registrado: 23 Jun 2003Mensajes: 97Ubicación: Las Palmas.. España
|
Publicado: Vie 28 Nov, 2003 7:42 pm Asunto: |
|
|
Muchas gracias Leo, tomo nota...
Argone |
|
| Volver arriba |
|
 |
|