SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: jjrr en Lunes 6 de Febrero de 2012, 13:48

Título: Escribir en disco
Publicado por: jjrr en Lunes 6 de Febrero de 2012, 13:48
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.
Título: Re:Escribir en disco
Publicado por: caperutxa en Lunes 6 de Febrero de 2012, 16:44
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.
Título: Re:Escribir en disco
Publicado por: jjrr en Lunes 6 de Febrero de 2012, 17:40
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.