Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-01-2010
NEG1414 NEG1414 is offline
Miembro
 
Registrado: mar 2007
Posts: 177
Poder: 18
NEG1414 Va por buen camino
Leer archivo Binario de una vez

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

Código:
  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.
Responder Con Cita
  #2  
Antiguo 31-01-2010
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Thumbs up

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.
Responder Con Cita
  #3  
Antiguo 01-02-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Leer un Archivo Binario voldemmor Varios 2 30-03-2009 18:19:25
transformar archivo binario a texto pakitto Varios 1 26-11-2008 14:09:45
Modificar registro en archivo binario tamarinda C++ Builder 3 06-03-2008 21:01:20
Eliminar registro en archivo binario tamarinda C++ Builder 2 06-03-2008 20:59:25
Cargar array of char de un archivo binario JosepZ Varios 9 12-11-2007 23:28:16


La franja horaria es GMT +2. Ahora son las 12:18:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi