Foros del Web » Programación para mayores de 30 ;) » Programación General »

Ayudita con archivos en C++

Estas en el tema de Ayudita con archivos en C++ en el foro de Programación General en Foros del Web. despues de leer bastante sobre archivos, arme esta funcion de prueba para leer texto de un txt, se guarda en "buffer" pero despues cuando muestro ...
  #1 (permalink)  
Antiguo 24/05/2005, 14:53
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 19 años, 9 meses
Puntos: 4
Ayudita con archivos en C++

despues de leer bastante sobre archivos, arme esta funcion de prueba para leer texto de un txt, se guarda en "buffer" pero despues cuando muestro me muestra el contenido del archivo y al final unos caracteres raros.. no entiendo, si yo extraigo X caracteres del archivo y luego le digo que muestre X caracteres, porque muestra demas? hay una forma de limpiar el contenido de "buffer" antes de asignarle otro valor?
Código PHP:
void leer()
{
    
char *buffer;
    
ifstream infile("d:\\datos.txt"ios::in);

    
// obtengo tamaño de archivo
    
infile.seekg(0ios::end);
    
int size infile.tellg();
    
infile.seekg(0ios::beg);
    
buffer = new char[size];
    
infile.read(buffersize);
    
cout << "\n\nTamaño de archivo: " << size;
    
cout << "\n\nContenido: " << buffer;
    
cout << "\n\nLargo del contenido: " << strlen(buffer);

  #2 (permalink)  
Antiguo 24/05/2005, 15:03
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Lo que te pasa es que estás cometiendo el típico buffer overflow.

Tu pides el tamaño, que te da por ejemplo 100 caracteres y creas el buffer. Pues bien, necesitas uno más, para que entre el '\0', que señala el fin de cadena. Si no, cuando tu pasas un puntero a una función que lo escribe ¿cómo sabría cuál es el final? Ella sigue hasta que encuentra un 0.
  #3 (permalink)  
Antiguo 24/05/2005, 15:46
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 19 años, 9 meses
Puntos: 4
sigue sin funcionar..

hice asi

buffer = new char[size+1];

y sigue pasando lo mismo
  #4 (permalink)  
Antiguo 24/05/2005, 16:29
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Inicializa a 0 antes ese caracter.
  #5 (permalink)  
Antiguo 24/05/2005, 16:36
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 19 años, 9 meses
Puntos: 4
? que caracter?

buffer = NULL ??
  #6 (permalink)  
Antiguo 24/05/2005, 16:48
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
No, el que contendrá el '\0'.

Lo mejor es que siempre inicialices todo a 0 con memcpy, con un bucle... Porque no todos los compilador al reservar memoria la "limpian" en C++.
  #7 (permalink)  
Antiguo 24/05/2005, 17:12
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 19 años, 9 meses
Puntos: 4
bue.. gracias pero ni idea de como usar memcpy
  #8 (permalink)  
Antiguo 24/05/2005, 17:19
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
memset quería decir (lapsus). Se usa para rellenar grandes zonas de memoria con un valor determinado.

Código:
#include <cstring>
void *memset(void *s, int c, size_t n);
Como veo que habías usado strlen que es de C, no te importará ya usar memset.

s es el puntero a la dirección a rellenar, buffer.
c es el caracter que se escribirá, 0.
n es el número de caracteres que se escribirán.

Devuelve el puntero.

En teoría solo deberías inicializar el último, porque los demás los rellenas y es mucho más rápido:

buffer[size] = '\0';
  #9 (permalink)  
Antiguo 24/05/2005, 19:12
Avatar de SiR.CARAJ0DIDA  
Fecha de Ingreso: junio-2004
Ubicación: Acá
Mensajes: 1.166
Antigüedad: 19 años, 9 meses
Puntos: 4
lo solucione usando la funcion get() en vez de read()
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 01:30.