• Miércoles 20 de Noviembre de 2024, 18:41

Autor Tema:  Escribir en disco  (Leído 1525 veces)

jjrr

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Escribir en disco
« en: Lunes 6 de Febrero de 2012, 13:48 »
0
Hola a todos, necesito escribir en disco una información que me llega mediante socket en paquetes de 8192 bytes, la cosa es que en un principio sabía el tamaño del fichero completo que iba a recibir y así no tenía ningún problema ya que reservaba memoria en un buffer con malloc y una vez que tenía el fichero completo en el buffer lo lamacenaba en disco con:

fstream ofs("salida", fstream::binary | fstream::out);
ofs.write(bufferfile, size);  // Siendo size el tamaño del fichero.

La cosa es que ahora no sé el tamaño del archivo que voy a recibir, solo sé que lo voy a rrecibir en fragmenos de 8192.

¿existe la forma de ir escribiendo en disco de forma dinámica, ose cada vez que recibo un paquete? Algo parecido a:

fstream ofs("salida", fstream::binary | fstream::out);
Bucle
{
   Leo paquete de 8192;
   Almceno en disco;
}

ofs.clese("salida");

Un saludo y muchas gracias.

caperutxa

  • Miembro activo
  • **
  • Mensajes: 40
  • Nacionalidad: 00
    • Ver Perfil
Re:Escribir en disco
« Respuesta #1 en: Lunes 6 de Febrero de 2012, 16:44 »
0
Había una manera de escribir en un archivo de manera "dinámica". No era exactamente eso pero servía.

Lo siento no recuerdo la sintaxis ni la función pero el concepto es este:
Tenemos un archivo creado para escritura: "archivo"

Leo el paquete y lo guardo en memoria, por ejemplo la variable "pack"
abro el archivo.
Leo hasta el final del archivo y guardo "el puntero" en "esa posición".
A partir de "esa posición" escribo la variable "pack" en el archivo.
guardo y cierro el archivo.

Y así repites el proceso hasta haber recibido todos los paquetes.

No es muy hábil pero sirve para ir trampeando hasta que consigas un método mejor.

PD: haz la prueba si no cerrando el archivo, puedes seguir escribiendo desde la última posición. Si es así ya tienes el tema solucionado.
Si quieres obtener resultados diferentes no hagas siempre lo mismo.


jjrr

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re:Escribir en disco
« Respuesta #2 en: Lunes 6 de Febrero de 2012, 17:40 »
0
Muchas gracias por contestar, de momento he hecho esto
Código: [Seleccionar]
char *bufferOut = (char*) malloc (sizeof(char)*blocksize);
     
      while(received = UDT::recv(recver, bufferOut, blocksize, 0) != 0)
      {

cout << "paquetes recibidos " << numPack << endl;
if ((eceived == UDT::ERROR)
    cout << "Send: " << UDT::getlasterror().getErrorMessage() << endl;
    exit(1);
}
ofs.write(bufferOut, blocksize);
bufferOut = (char*) malloc (sizeof(char)*blocksize);
numPack++;
      }
     
      free(bufferOut);
      ofs.close();
y parece que funciona.