Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Tamaño Buffer Split

Estas en el tema de Tamaño Buffer Split en el foro de C/C++ en Foros del Web. Estoy utilizando la funcion strtok para almacenar en un buffer algo hasta que encuentra un delemitador. buffer = strtok ( char * str, const char ...
  #1 (permalink)  
Antiguo 22/11/2011, 11:05
 
Fecha de Ingreso: agosto-2011
Mensajes: 17
Antigüedad: 13 años, 4 meses
Puntos: 0
Tamaño Buffer Split

Estoy utilizando la funcion strtok para almacenar en un buffer algo hasta que encuentra un delemitador. buffer = strtok ( char * str, const char * delimiters ) el problema es que para volver a escribir el contenido almacenado con la funcion write necesito saber cuanto ocupa pero no se como sacarlo. He googleado y decian varias soluciones como sizeof(buffer) o strlen(buffer), pero ninguna de ellas funciona. Alguien sabe algo? Gracias!
  #2 (permalink)  
Antiguo 22/11/2011, 12:01
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Tamaño Buffer Split

Con strlen(buffer) deberia andar...
podrias mostrar tu codigo para ver como lo tienes?
  #3 (permalink)  
Antiguo 22/11/2011, 14:54
 
Fecha de Ingreso: agosto-2011
Mensajes: 17
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Tamaño Buffer Split

Código:
//Guardamos las dos fotos en un archivo final, una detras de otra
      ofstream out;
      out.open("c:\\a3.jpg",ios::binary);
      out.write(buffer,length);
      out.write("#",sizeof("#"));
      out.write(buffer2,length2);
      out.write("#",sizeof("#"));
      out.close();

     ifstream in3;
      in3.open("c:\\a3.jpg",ios::binary);
      in3.seekg (0, ios::end);
      length3 = in3.tellg();
      in3.seekg (0, ios::beg);
      buffer3 = new char [length3];
      in3.read(buffer3,length3);
      ptr = strtok ( buffer3 , "#" );
     in3.close();

      ofstream out2;
      out2.open("c:\\a33.jpg",ios::binary);      
      out2.write(ptr,strlen(ptr));
      out2.close();
Ademas de no ir con strlen y eso...la segunda parte del archivo no la lee con strtok, me dice que no contiene nada si vuelvo a hacer strtok.El primero si, por que hago la comprovacion poniendo el tamaño del archivo que ya se cual es...y el buffer es correcto pero el siguiente que deberia de ser strtok( NULL,"#") me dice que no contiene nada.

Última edición por Apeiron; 22/11/2011 a las 15:02
  #4 (permalink)  
Antiguo 22/11/2011, 15:25
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Tamaño Buffer Split

El problema es que estas trabajando con archivos binarios.....seguramente dentro del jpg1 hay un byte en cero que hace las funciones de string de c crean que llegaste a un final de cadena.

Las funciones de string sirven cuando trabajas con string. Detectan un cero como fin de cadena. Es mas un archivo de texto siempre termina con un caracter especial que marca el fin del archivo (EOF)[no recuendo su numero]. En cambio si abrimos ese archivo como binario poco le va a importar ese caracter especial.

En modo binario se guian por el tamañan del archivo, adentro puede haber cualquier cosas y lo que es mas importante puede ser interpretada de cualquier manera. El modo texto plano de un archivo es una de esas forma de interpretar.

Asi que si usas strtok si o si debes trabajar con cadenas de caracteres (los caracteres ascii imprimibles).

Ahora resolviendo tu duda, en vez de pegar un # en la imagen (que si tratas de abrirla con el bloc de notas es casi seguro que ni lo ves ese #) deberias guardar la longitud del archivo.

Código C++:
Ver original
  1. ofstream out;
  2.       out.open("c:\\a3.jpg",ios::binary);
  3.       out.write(&length,sizeof(int));
  4.       out.write(buffer,length);
  5.       out.write(&length2,sizeof(int));
  6.       out.write(buffer2,length2);
  7.       out.close();

Para recuperar haces:

Código C++:
Ver original
  1. ifstream in3;
  2.       in3.open("c:\\a3.jpg",ios::binary);
  3.       in3.read(&length,sizeof(int));
  4.       buffer = new char[length];
  5.       in3.read(buffer,length);
  6.       in3.read(&length2,sizeof(int));
  7.       buffer2 = new char[length2];
  8.       in3.read(buffer2,length2);
  9.       in3.close();
  #5 (permalink)  
Antiguo 22/11/2011, 17:53
 
Fecha de Ingreso: agosto-2011
Mensajes: 17
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Tamaño Buffer Split

Entiendo pero este codigo no me compila me genera este error.

no matching function for call to `std::basic_ofstream<char, std::char_traits<char> >::write(int*, unsigned int)'

Solo se puede escribir una cadena de caracteres...pero mas o menos ya entiendo la idea. Escribir en el archivo el tamaño de cada foto y asi "dividirlo" en tamaños
  #6 (permalink)  
Antiguo 22/11/2011, 18:39
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Tamaño Buffer Split

Prueba haciendo un casteo:

in3.read( (char * ) &length,sizeof(int));

Etiquetas: split, strtok
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:32.