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

buffer c++

Estas en el tema de buffer c++ en el foro de C/C++ en Foros del Web. Hola a todos, He realizado un programa en c++ que almacena en un buffer creado por mi una serie de datos, y posteriormente vuelca el ...
  #1 (permalink)  
Antiguo 05/02/2009, 06:07
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
buffer c++

Hola a todos,
He realizado un programa en c++ que almacena en un buffer creado por mi una serie de datos, y posteriormente vuelca el contenido de ese buffer en un fichero.
Los datos son calculados en un bucle for, y cuando termina ese bucle for, es cuando vuelco los resultados al fichero. El bucle for va a ser ejecutado un numero muy elevado de veces.
Me gustaria que cuando volcase en el fichero, a continuacion borrase todo el contenido de mi buffer, para que cuando vuelva a entrar en el for, mi buffer este totalmente vacio, y asi no desbordase mi buffer debido a tanta cantidad de datos.
¿Cual es la instruccion que me permite el borrado de mi buffer??ç
Os pongo un fragmento del codigo:

char buffer[1024]; //variable global

void ........... (){ //funcion donde se llama al for y escribe en el buffer
.....
....
for(......){
.....
.....
sprintf(buffer, ......);//introduzco datos en mi buffer
}
log(buffer);//funcion que vuelca los datos en el fichero
¿?// aqui me gustaria que hubiese una instruccion para limpiar el buffer
}


¿Alguna idea o sugerencia?
Gracias de antemano
Un saludo
  #2 (permalink)  
Antiguo 05/02/2009, 06:16
retrodev
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: buffer c++

Saludos

En un principio, en esta url, tienes un manejador de matrices bastante util.Es en c/c++

http://proiektutaldea.wordpress.com/2007/12/03/funciones-matriz-dinamica/

Como puedes observar, solamente usando la funcion :

free(buffer);

Deberia serte suficiente para "liberar" el contenido de la matriz.
Espero a ver sido de ayuda
  #3 (permalink)  
Antiguo 05/02/2009, 06:41
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
instruccion invalida

Pues parece ser que esta instruccion no es valida en mi caso, puede ser pq tengo que pasarle como argumento algo distinto a un buffer de caracteres no??
Me aparece el siguiente mensaje de error en tiempo de ejecucion:


*** glibc detected *** ./elevationmap: free(): invalid pointer: 0x080f7920 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb79dca85]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb79e04f0]
./elevationmap[0x8050f74]
./elevationmap[0x804e051]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7987450]
./elevationmap(__gxx_personality_v0+0x339)[0x804da61]
======= Memory map: ========
08048000-080f7000 r-xp 00000000 08:05 8798943 /home/miguel/Documentos/cvs/romeo_yarp/elevationmap/elevationmap
080f7000-080f8000 rw-p 000af000 08:05 8798943 /home/miguel/Documentos/cvs/romeo_yarp/elevationmap/elevationmap
080f8000-0915a000 rw-p 080f8000 00:00 0 [heap]
b25e3000-b260b000 r-xp 00000000 08:05 11622520 /usr/lib/libkdefx.so.4.2.0
b260b000-b260c000 rw-p 00027000 08:05 11622520 /usr/lib/libkdefx.so.4.2.0
b2625000-b265c000 r-xp 00000000 08:05 11657237 /usr/lib/kde3/plugins/styles/qtcurve.so
b265c000-b265e000 rw-p 00036000 08:05 11657237 /usr/lib/kde3/plugins/styles/qtcurve.so
b265e000-b2664000 r--s 00000000 08:05 11993548 /var/cache/fontconfig/945677eb7aeaf62f1d50efc3fb3ec7d8-x86.cache-2
b2664000-b2667000 r--s 00000000 08:05 11994773 /var/cache/fontconfig/e383d7ea5fbe662a33d9b44caf393297-x86.cache-2
b2667000-b2668000 r--s 00000000 08:05 11994772 /var/cache/fontconfig/c69f04ab05004e31a6d5e715764f16d8-x86.cache-2
b2668000-b2669000 r--s 00000000 08:05 11994771 /var/cache/fontconfig/4c73fe0c47614734b17d736dbde7580a-x86.cache-2
b2669000-b266c000 r--s 00000000 08:05 11994769 /var/cache/fontconfig/a755afe4a08bf5b97852ceb7400b47bc-x86.cache-2
b266c000-b266f000 r--s 00000000 08:05 11994754 /var/cache/fontconfig/6d41288fd70b0be22e8c3a91e032eec0-x86.cache-2
b266f000-b2672000 r--s 00000000 08:05 11994752 /var/cache/fontconfig/de156ccd2eddbdc19d37a45b8b2aac9c-x86.cache-2
b2672000-b267a000 r--s 00000000 08:05 11994691 /var/cache/fontconfig/e3de0de479f42330eadf588a55fb5bf4-x86.cache-2
b267a000-b2682000 r--s 00000000 08:05 11994690 /var/cache/fontconfig/0f34bcd4b6ee430af32735b75db7f02b-x86.cache-2
b2682000-b26a4000 r--s 00000000 08:05 11995039 /var/cache/fontconfig/365b55f210c0a22e9a19e35191240f32-x86.cache-2
b26a4000-b26c5000 r--p 00000000 08:05 11896644 /usr/share/locale-langpack/es/LC_MESSAGES/libc.mo
b26c5000-b26d6000 r-xp 00000000 08:05 11617992 /usr/lib/libXft.so.2.1.2
b26d6000-b26d7000 rw-p 00010000 08:05 11617992 /usr/lib/libXft.so.2.1.2
b26d7000-b2724000 r-xp 00000000 08:05 11618012 /usr/lib/libXt.so.6.0.0
b2724000-b2728000 rw-p 0004c000 08:05 11618012 /usr/lib/libXt.so.6.0.0
b2728000-b2efe000 r-xp 00000000 08:05 11618839 /usr/lib/libqt-mt.so.3.3.8
b2efe000-b2f44000 rw-p 007d5000 08:05 11618839 /usr/lib/libqt-mt.so.3.3.8
b2f44000-b2f48000 rw-p b2f44 Cancelado

GRacias de todas formas por intentarlo
  #4 (permalink)  
Antiguo 05/02/2009, 06:48
retrodev
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: buffer c++

Saludos

Releyendo tu primer mensaje, creo entender que te da un desbordamiento, y pienso que lo que deberias hacer es volver a escribir en la posicion 0 de la matriz de nuevo, para sobreescribir los datos anteriores. Tambien para asegurarte, podria rellenarla de un valor 0, para asi asegurarte que esta "vacia" de los anteriores datos.

A ver si asi, conseguimos que funcione :)
  #5 (permalink)  
Antiguo 05/02/2009, 06:59
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: buffer c++

Perdona, pero es que no se que quieres decir con "la matriz".
Mi programa lo que crea es un buffer, y los datos los va guardando en ese buffer, cuando termina el for, los almacena en un archivo.
Resulta que tb hago que me muestre los datos por pantalla, y noto que por pantalla da muxo mas datos de los que luego guarda.
Por tanto, he pensado que lo logico seria que cuando termine el for, y vuelque el contenido del buffer en el archivo, vaciar el BUFFER, para que al realizar otra vez el for este vacio y no me deje ningun punto por ahi perdido sin guardar.
Por favor, si tu ves otra manera de realizar mi proposito, ¿podrias indicarmelo?
Muxas gracias de nuevo
  #6 (permalink)  
Antiguo 05/02/2009, 07:14
retrodev
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: buffer c++

Vale. Veras, tengo un pequeño interprete desarrollado para dar explicaciones de este tipo.

Este es el codigo:

Código:
#include "sunburn_h.h"

// creditos
char creditos[255] = "Sun - Compilador\nVersion 0.0.1\nFecha de inicio 07/05/08\nMade by retrodev";
// Variables para cargar el fichero 
char *fileArgumentName;
FILE *fileSb;
FILE *fileObj;
// Variables para volcar el fichero en un array.
char codeSb[2048]; 
char bufferCodeSb[81];
char cursorFile;
int contadorCaracteres=0;
int contador_CF;
int contador_BL;
int xd=0;
int xdd=0;

int main(int argc, char *argv[])
{
// Recoge el nombre del fichero a abrir. Si no se le pasa argumento, se sale de la ejecucion
// asignamos ademas el valor del argumento a fileArgumentName
// se abre el fichero, y miramos si existe sino, error2
if ((fileArgumentName = argv[1]) == NULL) 
{  
	cout << creditos << endl; 
	exit(0); 
}
   
if ((fileSb = fopen (fileArgumentName,"r")) == NULL) 
{ 
	cout << "Error 2: Fichero no valido" << endl; 
	exit(0); 
}

if ((fileObj = fopen (strcat(fileArgumentName,".osb"),"w")) == NULL) 
{ 
	cout << "Error 2: Fichero no valido" << endl; 
	exit(0); 
}
while ((cursorFile =getc(fileSb)) != EOF ) 
{ 
  
	int comp=0,cm=0;
	fscanf ( fileSb,"%s",bufferCodeSb);
   
	if (cursorFile == '\n')
		{ contador_CF++; }
  
	if (cursorFile ==  ' ') 
		{ contador_BL++; }
  
	if ((comp = strcmp(bufferCodeSb,"IniCon")) == 0 && _InitAppDeclare == 1 )
		{  
			cout <<"InitCon ya iniciada"<<endl;
			exit(0); 
		}

	if ((comp = strcmp( bufferCodeSb,"IniCon")) == 0 && _InitAppDeclare == 0 ) 
		{ 
			_InitAppDeclare = 1; 
		//	cout <<"_api1 "; 
			fprintf ( fileObj,"_api1 ");
		}
    if ( _InitAppDeclare == 1 ) 
    { 
        	if ((comp = strcmp( bufferCodeSb,"dv")) == 0 )
        		{ 
        		//	cout <<"[v] "; 
	           		fprintf ( fileObj,"[v] ");
	           		
	           		while (cm !=1){
	           	    cm = strcmp (bufferCodeSb, ";");        		
                    fscanf ( fileSb,"%s",bufferCodeSb);
                    cout << bufferCodeSb<<" ";
                    fprintf ( fileObj,"%s ",bufferCodeSb);
                }
              
            
	           	}
   
   	        if ((comp = strcmp( bufferCodeSb,"EndCon")) == 0) 
        		{ 
        	//		cout <<"[x] ";
        			fprintf ( fileObj,"[x] ");
        			fclose(fileSb);
                    fclose(fileObj);
                   	break;
	           	}
        	 if ((comp = strcmp( bufferCodeSb,"echo")) == 0) 
		        { 
	           //  	cout <<"[e] "; 
	                fprintf ( fileObj,"[e] ");
	                fscanf(fileSb,"%s",bufferCodeSb); 
        		    while(xdd!=81){
               //     cout << bufferCodeSb<<" ";
                    fprintf ( fileObj,"%s ",bufferCodeSb);
                    fscanf(fileSb,"%s",bufferCodeSb); 
                    xdd++;
                    xd = strcmp (bufferCodeSb, ";"); 
                    if ( xd==0) { //cout << bufferCodeSb<<" ";
                    fprintf ( fileObj,"%s ",bufferCodeSb);break;}
                   }
                }
      } else { 
                cout <<"Error 01 : No se ha iniciado la funcion _InitCon"<<endl; 
                exit(0);
    }
	codeSb[contadorCaracteres] = cursorFile;
	contadorCaracteres++; 
  }
cout << creditos << endl;     
cout <<endl<< "Total caracteres leidos = " << contadorCaracteres << endl;    
cout << "Total Retornos de carro leidos = " << contador_CF << endl;    
cout << "Total espacios leidos = " << contador_BL << endl;      
system("pause");

return EXIT_SUCCESS;
}
Código:
#include <cstdlib>
#include <iostream>
#include <conio2.h>
using namespace std;
int _InitAppDeclare = 0;
Este codigo lee y interpreta el siguiente fichero :

Código:
_IniCon
echo Ahora si que admite espacios ^_^ ;
echo Es mas, ahora es hasta multilinea ;
echo es una forma mas o menos curiosa de emitir texto ;
EndCon
Espero que te guie lo suficiente como para continuar, ahora he de ausentarme un rato para ir a comer.

Al volver, si te ha quedado alguna duda, posteala y miramos de resolverla.
  #7 (permalink)  
Antiguo 06/02/2009, 04:32
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: buffer c++

ufff...creo que es demasiado complicado para lo que realmente es.
Aver, te explico un poco mejor lo que hago: mi programa, tiene una funcion, que mediante un bucle for calcula un conjunto de puntos de 3 en 3.
Esta funcion, en el main, va a ser llamada un numero muy grande de veces.
Te vuelvo a reescribir el codigo, explicandolo un poco mejor:

char buffer[1024]; //variable global

void ........... (){ //funcion donde se llama al for y escribe en el buffer
.....
....
for(......){
.....
instrucciones;//instrucciones para el calculo de los 3 puntos
sprintf(buffer, ......);//introduzco datos en mi buffer, lo hago con formato, por que en mi
//fichero quiero que los 3 puntos esten en una linea.
}
log(buffer);//funcion que vuelca los datos en el fichero
¿?// aqui me gustaria que hubiese una instruccion para limpiar el buffer
}

Gracias por lo que estas haciendo.
Saludos!
  #8 (permalink)  
Antiguo 06/02/2009, 14:31
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 10 meses
Puntos: 28
Respuesta: buffer c++

Te recomiendo que uses la funcion "memset", imagino que lo que deseas es asignat 0 a todo el arreglo en vez de eliminarlo, por algo es un arreglo estático (para no borrarlo y crearlo cada vez).

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #9 (permalink)  
Antiguo 06/02/2009, 15:59
Avatar de MeduZaPaT  
Fecha de Ingreso: enero-2009
Ubicación: USA
Mensajes: 106
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: buffer c++

porque si estas trabajando en C++ usas arrays de char para hacer strings?
que ganas de complicarse usando cosas de C en C++
los archivos en C++ se leen y/o escriben con streams
  #10 (permalink)  
Antiguo 09/02/2009, 06:56
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: buffer c++

con streams??
es que no se tio, yo nunca he utilizado c++, solo aprendi c, y por eso estaba acostumbrado a los char...
te sabes alguna pagina buena donde haya material para aprender el manejo de ficheros usando streams??
gracias!
  #11 (permalink)  
Antiguo 09/02/2009, 07:20
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 10 meses
Puntos: 28
Respuesta: buffer c++

Cita:
porque si estas trabajando en C++ usas arrays de char para hacer strings?...
Por esto:
Cita:
...es que no se tio, yo nunca he utilizado c++, solo aprendi c...
Si ya lo tienes hecho en C termina tu programa en C hasta que puedas ejecutarlo perfectamente, luego si deseas aprender C++ puedes cambiarlo de la manera que consideres conveniente. Igual tendrás nuestra ayuda.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #12 (permalink)  
Antiguo 10/02/2009, 04:32
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: buffer c++

Weno, tengo que decir que buscando en internet, he transformado todo mi codigo C para el manejo del archivo, a C++, usando streams...muxas gracias x la ayuda!
Pero resulta que tengo un problema, y es el siguiente:
Mi programa obtiene numeros con una gran cantidad de decimales, y al usar el operador "<<" para introducirlos en el fichero, me los trunca o redondeaa...no se bien! no quiero que me redondee nada, solamente que introduzca los numeros en el fichero tal cual!!!
alguna sugerecia para estooo??
GRACIASSSSSSSSSSSSSS
  #13 (permalink)  
Antiguo 10/02/2009, 05:21
 
Fecha de Ingreso: noviembre-2008
Ubicación: Sevilla
Mensajes: 157
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: buffer c++

Solucionado chicos:
fichout << std::fixed << std::setprecision(6) << datoss ke quiero meter en el fichero
  #14 (permalink)  
Antiguo 11/02/2009, 20:35
Avatar de MeduZaPaT  
Fecha de Ingreso: enero-2009
Ubicación: USA
Mensajes: 106
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: buffer c++

Cita:
Iniciado por _Lucifer_ Ver Mensaje
Por esto:

Si ya lo tienes hecho en C termina tu programa en C hasta que puedas ejecutarlo perfectamente, luego si deseas aprender C++ puedes cambiarlo de la manera que consideres conveniente. Igual tendrás nuestra ayuda.

Saludos
si lo haces en C quedate en C
C++ no tiene nada que ver con C o viceversa, mesclar codigos solo trae errores a futuro
si queres aprender lo mejor es leer alguna de las tantas guias que sobran por la web.
  #15 (permalink)  
Antiguo 11/02/2009, 20:36
Avatar de MeduZaPaT  
Fecha de Ingreso: enero-2009
Ubicación: USA
Mensajes: 106
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: buffer c++

Cita:
Iniciado por marodal Ver Mensaje
Weno, tengo que decir que buscando en internet, he transformado todo mi codigo C para el manejo del archivo, a C++, usando streams...muxas gracias x la ayuda!
Pero resulta que tengo un problema, y es el siguiente:
Mi programa obtiene numeros con una gran cantidad de decimales, y al usar el operador "<<" para introducirlos en el fichero, me los trunca o redondeaa...no se bien! no quiero que me redondee nada, solamente que introduzca los numeros en el fichero tal cual!!!
alguna sugerecia para estooo??
GRACIASSSSSSSSSSSSSS
para manejar las salidas de << usas streamstring buscalo y te vas a asumbrar lo facil que es.
  #16 (permalink)  
Antiguo 11/02/2009, 20:36
Avatar de MeduZaPaT  
Fecha de Ingreso: enero-2009
Ubicación: USA
Mensajes: 106
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: buffer c++

Cita:
Iniciado por marodal Ver Mensaje
Solucionado chicos:
fichout << std::fixed << std::setprecision(6) << datoss ke quiero meter en el fichero
jajajaja llegue tarde iba respondiendo 1 x 1

que bueno viste? es muy facil, mas facil que C
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 13:50.