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

"Basura" en fichero.

Estas en el tema de "Basura" en fichero. en el foro de C/C++ en Foros del Web. Tengo este programilla, que funciona perfectamente, solo que cuando abro el fichero creado me aparecen caracteres que yo no he introducido y que no tienen ...
  #1 (permalink)  
Antiguo 21/11/2006, 14:02
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
"Basura" en fichero.

Tengo este programilla, que funciona perfectamente, solo que cuando abro el fichero creado me aparecen caracteres que yo no he introducido y que no tienen nada que ver. Creo que el problema está en las líneas en rojo, alguién podría ayudarme?

Código:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define APELLIDO 20

int menu();
void escribir();
void mostrar();

int main()
{
 int op;
 while(op = menu())
 {
  switch(op)
  {
            case 1:
                  escribir();
                  break;
            case 2:
                  mostrar();
                  break;
  }
 }
}

int menu()
{
    int op;

    printf("\n 1.-Introducir apellidos.");
    printf("\n 2.-Mostrar.");
    printf("\n\t 0.-Salir.");
    printf("\n\t\t Opcion?:");
    scanf("%d",&op);
    return op;
}

void escribir()
{
 char apellido[APELLIDO];
 char sn[1];
 FILE * fd;
 fd = fopen("alumnos.txt","a");
 
 do{
    printf("\n Introduzca apellido: ");
    scanf("%s",apellido);
    fwrite(apellido,sizeof(char[APELLIDO]),1,fd);    printf("\n Otro apellido (s/n) ?");
    scanf("%s",sn);
   } while(sn[0]=='s' || sn[0]=='S');
 fclose(fd); 
}

void mostrar()
{
 FILE * fd;
 char apellido[APELLIDO];
 
 fd = fopen("alumnos.txt","r");
 while(fread(apellido,sizeof(apellido),1,fd)) {
  printf("\n %s ",apellido);
 }
 fclose(fd);
}
Gracias por su atención, saludos.

Última edición por yournightmare86; 21/11/2006 a las 15:02
  #2 (permalink)  
Antiguo 21/11/2006, 14:12
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Código:
fwrite(apellido,sizeof(char[APELLIDO]),1,fd);
Eso va escribir siempre la misma cantidad de bytes, independientemente del tamaño de la cadena, podrias usar strlen().

PD. No hay linea roja.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 21/11/2006, 14:57
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Si ahora si:P
Probé con
Código:
fwrite(apellido,sizeof(char[APELLIDO]),1,fd);
pero seguía teniendo el mismo problema. Mi profesor me aconsejo no usar strlen, sino usar size of.. y en caso de usar strlen seria strlen(apellido) o strlen(apellido+1)? Mi profesor dijo que strlen era una chapuza pero quizás se refería a estructuras de datos, y no a un simple char.
Gracias por la respuesta.
Saludos.
  #4 (permalink)  
Antiguo 21/11/2006, 15:00
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Ese codigo era el tuyo, no uno arreglado :P

strlen no es una chapuza sino una funcion que tiene un uso, obtener el tamaño de una cadena terminada en 0. Si usas strlen tenes que contar con que escribis datos de tamaño VARIABLE. Sino podes inicializar todo el array apellido con memset a 0 y esos seran los caracteres que escribiras ... si usas strlen podes escribir antes un int con el tamaño de la cadena o usar el 0 para leer despues (ahi si usarias strlen() + 1) ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 21/11/2006, 15:04
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Vale mensaje recibido! gracias de nuevo.
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 03:41.