C/Visual C - ¿que esta mal aqui?Urge

 
Vista:

¿que esta mal aqui?Urge

Publicado por jose (2 intervenciones) el 29/08/2001 17:06:58
Hola, gracias por leer ésto.
El siguiente programa no tiene errores, funciana bien pero al terminar sale el sigueinte mensaje de advertencia:
"Se ha producido la excepcion unknow software exception(0xc000000) en la direccion 0x77fb043c"

"Haga click en aceptar para finalizar este programa
Haga click en Cancelar para depurar el programa"

El codigo es:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

void main ()
{
FILE *punfil;
char origen[50], destino[50], *punori=origen, *pundes=destino;

clrscr();

///////////////////*crear el fichero en modo lectura/escritura*/////////////////
if((punfil=fopen("C:\\ficher\\fichedos.txt","w+b"))==NULL)
{
printf("\nError al crear el fichero");
exit(1);
}


printf("\nEscribe una frase para el fichero\t");
gets(origen);


while(*punori)
{
if((fputc(*punori,punfil))!=*punori) /*si no devuelve el caracter es error*/
{
printf("Error al escribir un caracter en el fichero");
exit(1);
}
punori++;
}

/*rebobinar el fichero*/
rewind(punfil);

/*leerr el fichero, almacenando caracter a caracter el vector "destino"*/

while(!feof(punfil))
{
*pundes=getc(punfil);
pundes++;
}

*pundes='\0';/*a
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿que esta mal aqui?Urge

Publicado por Oscar Vazquez (9 intervenciones) el 04/09/2001 21:42:54
El código funciona, pero podes tener varios problemas de overflow.
1- El gets() no controla si el string ingresado es mayor al buffer asignado
si ingresas un dato de 50 bytes no queda lugar para almacenar el NULL final del string.

2-Al leer pasa exactamente lo mismo. En la instrucción "*pundes='\0';" podes estar sobre-escribiendo memoria

Le agregé la verificación en la lectura del archivo, para resolver la otra, deberías utilizar otro mecanismo de ingreso de datos.
/* Verificar que existe el espacio suficiente para almacenar el string */
int nMaxLen = sizeof(destino) - 1;
if ( strlen( origen ) > nMaxLen )
origen[nMaxLen] = 0;

/*leer el fichero, almacenando caracter a caracter el vector "destino"*/
while(!feof(punfil))
{
*pundes=getc(punfil);
pundes++;
}

*pundes='\0';

fclose(punfil); /* Cerrar el archivo */
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar