PDA

Ver la Versión Completa : Leer archivo Binario de una vez


NEG1414
30-01-2010, 18:51:26
Buenas...

Tengo un archivo binario en el que he guardado un numero muy grande de chars (unos 70000000).
Al recuperar los datos del archivo, si lo hago char a char me consume una gran cantidad de tiempo por el acceso a disco.
Para ahorrar tiempo he pensado acceder a disco la menor cantidad de veces posible (Una vez la ideal). para ello pense crear una variable arreglo de chars lo mas grande posible.El arreglo mas grande de Chars que creo que se puede no es ni por asomo la cantidad necesaria para leerlo de una vez,de todas formas he reducido el numero de accesos a disco y con el el tiempo de ejecucion.

He intentado hacer un arreglo de chars de la forma



char *buffer;
buffer = (char*)malloc(sizeof(char)*700000000);

Archivo.read((char *)(&buffer),sizeof(buffer));

for (unsigned int a=1;a<700000000;)
{
char dat = buffer[a];
}

La lectura no da problemas pero en cuanto asigno el primer char de buffer a dat me da error.
¿Que hago mal?..¿Es posible leer el archivo de una vez?

Gracias.

_cero_
31-01-2010, 02:31:51
700000000 Char a char si se oye mucho char XXD, porque no intentas sustituir el tipo “char” por un tipo “String” y lees las posiciones con “SubString”, de este modo solo cargas una cadena en lugar de cargar muchos caracteres, no se a lo mejor así funciona.

Pd1. No tengo builder a mano así que prueba y me dices.
Pd2. Tal vez si expones la razón de guardar tanto carácter, te pueda dar unas ideas mejores.

escafandra
01-02-2010, 00:12:17
Es mejor que leer char a char (o byte a byte) un buffer intermedio y leer grandes porciones del archivo.

Un Array de chars muy grande no lo puedes reservar dentro de una función como char buffer[700000000], pues esa reserva se hace en la pila y la consume. En una variable global quizás, pero lo mejor es, tratándose de C++:

char* buffer = new char[700000000];

Las funciones malloc y calloc también sirven. En todos estos casos sizeof(buffer) no devuelve 700000000 sino 4 con lo que la lectura tal y como la planteas, lee 4 bytes.

Para leer y escribir ficheros, C++ dispone de las clases stream: ifstream y ofstream que disponen de un buffer intermedio gestionado por ellas mismas.

La idea del String no sirve en este caso porque se pretende leer un archivo binario y no de texto, y el tratamiento de los retornos de carro y línea corrompen el resultado.

Sin embargo el uso de un TMemoryStream si es otra buena solución, claro que eso no es C++ estándar sino la VCL.

Saludos.