Problema en c

Santii

A ver si me podeis exar una mano, ya que llevo un buen rato para solucionar este problema y no veo la forma de hacerlo. Tengo un fichero que guardan datos de alumnos, pero en la opcion de borrar, no borra, ya que me da un error :

os dejo el codigo del modulo, si kereis el codigo entero decirmelo q os lo paso :

void borrar(struct alumno datos, FILE *fichero1)
{
  FILE *fichero2;
  int fin,opcion, cod,ok=0;
  do
  {
    fin=0;
    clrscr();
    gotoxy(25,11);
    printf("1. Borrar un alumno por codigo");
    gotoxy(25,13);
    printf("2. Salir al menu principal");
    gotoxy(25,15);
    printf("Opcion: ");
    scanf("%d",&opcion);
    switch(opcion)
    {
      default:
      {
	clrscr();
	gotoxy(28,12);
	printf("Opcion incorrecta");
	gotoxy(25,14);
	printf("Pulse una tecla para continuar");
	getche();
      }
      case 1:
      {
	clrscr();
	gotoxy(20,6);
	printf("Codigo de la persona: ");
	fflush(stdin);
	scanf("%d",&cod);
	fichero1=fopen("alum.dat","a+b");
	fichero2=fopen("aux.dat","w+b");
	fread(&datos,sizeof(datos),1,fichero1);
	while(!feof(fichero1))
	{
	  if(cod==datos.codigo)
	  {
	    gotoxy(25,9);
	    printf("Nombre: ");
	    puts(datos.nombre);
	    gotoxy(25,11);
	    printf("Curso. ");
	    puts(datos.curso);
	    gotoxy(25,13);
	    printf("Edad: %d",datos.edad);
	    gotoxy(25,15);
	    printf("Este alumno va a ser elimiando de la base");
	    gotoxy(25,18);
	    printf("Pulse una tecla para continuar");
	    getche();
	    ok=1;
	  }
	  else
	  {
	    fwrite(&datos,sizeof(datos),1,fichero2); 
	  }
	  if(feof(fichero1)&& ok==0)
	  {
	    gotoxy(20,10);
	    printf("No hay ningun nombre que concuerde");
	    gotoxy(20,12);
	    printf("Pulse una tecla para continuar");
	    getche();
	  }
	  fread(&datos,sizeof(datos),1,fichero1);
	}

fclose(fichero1);
 	fclose(fichero2);
remove("alum.dat");
rename("aux.dat","alum.dat");
break;
  } //fin case 1
  case 2:
  {
clrscr();
gotoxy(25,12);
printf("Volviendo al menu principal");
gotoxy(25,14);
printf("Pulse una tecla para continuar");
fin=1;
  }
} //fin switch
  }while(fin==0);
}
elkaoD

No sé, pero de momento te faltan dos break en el case.

¿Por qué pasas como parámetro fichero1 si lo abres en la propia función?

¿No compruebas si devuelve código de error el fopen?

A esta parte del código nunca llega.

if(feof(fichero1)&& ok==0)
{
 gotoxy(20,10);
 printf("No hay ningun nombre que concuerde");
 gotoxy(20,12);
 printf("Pulse una tecla para continuar");
 getche();
}

Y, justo encima de fwrite(&datos,sizeof(datos),1,fichero2); pon un printf ("DEBUG"); para saber que si llega.

Aún así, el mensaje suena a error del sistema operativo/disco duro. ¿Programas con Borland? Prueba otro compilador.

fichero1 lo has abierto con el apuntador de fichero apuntando al final por lo que además tienes un bonito EOF directo. Creo que quieres abrirlo con "r+b"

Santii

habia probado a abrirlo con distintos tipos, pero nada me sigue pasadno -_-

q programa usas tu ? he intentao configurar varios para probar, pero al fianl siempre me iba al borland por comodidad xD

elkaoD

Yo uso Dev-CPP en Windows y KDevelop como IDE en Linux.

No sé por qué sospecho que el error es de Borland, que quizá el Turbo C no esté preparado para NTFS o lo que sea. También mírate a ver si el problema va a ser el remove o el rename y no la propia apertura y escritura de los ficheros.

¿Está el modo debug activado? Quítalo por si acaso también.

Aún así mientras tanto prueba arreglando el resto de cosas que te he dicho.

Santii

Todas las cosas que me has dicho las he arreglado, y el problema salta en el fwrite, no se porq... -_-

elkaoD

Prueba a hacer un programa que simplemte abra y escriba en un archivo.

Si falla es Borland o tu disco duro.

Si no, pasa todo el código fuente.

PirLo_21

#5 seguramente no te deja hacer el fwrite xq el fichero no estará abierto correctamente en el fopen. Prueba a poner el codigo de error en el fopen

NecroFox

Como dicen por ahí, prueba a comprobar el fopen y que no te de error, normalmente si no te deja escribir, es por que el fichero no esta creado o no esta bien abierto.

P.D.: Comenta los programas que eso Latorre lo valora ^.

ninja edit: Al Borland se le suele ir de vez en cuando la olla... no me extrañaría que también fuese por eso jajajaj!!!

Santii

#8 ni latorre, ni lasheras ni diego han conseguido solucionarlo :( y he probao con el dev cpp y demas y nada y estoy ya harto xDDD lista 8 ejercicio 5 si lo tienes pasamelo :P:P

elkaoD

¿Pero has comprobado el fopen? ¿Has hecho un programa normal que sólo escriba y no falla? ¿Has subido el código a pastebin y lo has posteado para que podamos mirarlo?

Santii

si que he comprobado el fopen, y el error da en el fwrite y/o en el cierre del fichero, he exo un programa unicmanete para abrir crear cambiar etc y no hay problema... pero lo paso a este y me dice q flores xd

elkaoD

Pues lo dicho, sube el código fuente. ¿El fopen del archivo que escribes exactamente qué devuelve?

PirLo_21

#11 asi no se puede tronco! da mas datosssss!

Santii

http://pastebin.com/m22a88102 ahi lo he subido, aunq tambien lo subo aki

/***************************************************************************
Programa: Ejercicio 5 Lista 8
Autor: Santiago Perez Gran
Fecha: 20/04/2008
Finalidad: Alumnos
Comentarios:
Historia: v1.0
Modo de utilizacion:
***************************************************************************/

#include <stdio.h>  /* Funciones de entrada y salida de datos */
#include <conio.h>  /* Funciones de entrada y salida de consola */
#include <dos.h>    /* Delay */
#include <stdlib.h> /* Funciones de numeros aleatorios */
#include <string.h> /* Cadenas de caractereres */

struct alumno
{
  int codigo;
  char curso[4];
  char nombre[45];
  int edad;
};

FILE *fichero1;
FILE *fichero2;

void crear (struct alumno datos)
{
  clrscr();
  int ok;
  char a;
  fichero1=fopen("alum.dat","a+b");
  if(fichero1==NULL)
  {
    gotoxy(20,12);
    printf("Error en la apertura de los ficheros");
    gotoxy(25,14);
    printf("Pulse una tecla para continuar");
  }
  else
  {
    a=getc(fichero1);
    if(a==EOF)
    {
      fclose(fichero1);
      fichero1=fopen("alum.dat","a+b");
      gotoxy(25,10);
      printf("Codigo: ");
      fflush(stdin);
      scanf("%d",&datos.codigo);
      gotoxy(25,12);
      printf("Curso: ");
      fflush(stdin);
      gets(datos.curso);
      gotoxy(25,14);
      printf("Nombre: ");
      gets(datos.nombre);
      gotoxy(25,16);
      printf("Edad: ");
      fflush(stdin);
      scanf("%d",datos.edad);
      fwrite(&datos,sizeof(struct alumno),1,fichero1);
      fclose(fichero1);
      gotoxy(20,18);
      printf("Pulse una tecla para continuar");
    }
  }
}

void visualizar(struct alumno datos)
{
  fichero1=fopen("alum.dat","r+b");
  clrscr();
  if(fichero1==NULL)
  {
    gotoxy(25,12);
    printf("Error en la apertura del fichero");
    gotoxy(25,14);
    printf("Pulse una tecla para continuar");
  }
  else
  {
    fread(&datos,sizeof(struct alumno),1,fichero1);
    while(!feof(fichero1))
    {
      clrscr();
      gotoxy(25,9);
      printf("Codigo: %d",datos.codigo);
      gotoxy(25,11);
      printf("Curso: ");
      puts(datos.curso);
      gotoxy(25,13);
      printf("Nombre: ");
      puts(datos.nombre);
      gotoxy(25,15);
      printf("Edad: %d",datos.edad);
      fread(&datos,sizeof(struct alumno),1,fichero1);
      gotoxy(25,20);
      printf("Pulse una teclar para continuar");
      getche();
    }
  }
}

void anadir(struct alumno datos)
{
  int opcion,fin,cod,ok;
  do
  {
    fin=0;
    clrscr();
    gotoxy(25,11);
    printf("1. Añadir un nuevo alumno");
    gotoxy(25,13);
    printf("2. Salir al menu principal");
    gotoxy(25,15);
    printf("Opcion: ");
    scanf("%d",&opcion);
    switch(opcion)
    {
      default:
      {
	clrscr();
	gotoxy(28,12);
	printf("Opcion erronea");
	gotoxy(25,14);
	printf("Pulse una tecla para continuar");
	getche();
	break;
      }
      case 1:
      {
	fichero1=fopen("alum.dat","a+b");
	if(fichero1==NULL)
	{
	  clrscr();
	  gotoxy(25,12);
	  printf("Error en la apertura del fichero");
	  gotoxy(25,14);
	  printf("Pulse una tecla para continuar");
	  getche();
	}
	else
	{
	  do
	  {
	    clrscr();
	    gotoxy(30,3);
	    printf("Añadir alumno");
	    gotoxy(25,10);
	    printf("Codigo: ");
	    fflush(stdin);
	    scanf("%d",&cod);
	    ok=0;
	    rewind(fichero1);
	    fread(&datos,sizeof(struct alumno),1,fichero1);
	    while(!feof(fichero1))
	    {
	      if(datos.codigo==cod)
	      {
		ok=1;
	      }
	      fread(&datos,sizeof(struct alumno),1,fichero1);
	    }
	    if(ok==1)
	    {
	      gotoxy(25,13);
	      printf("El numero de cuenta ya existe");
	      gotoxy(26,14);
	      printf("introduzca la cuenta de nuevo");
	      delay(1000);
	    }
	  }while(ok==1);
	  datos.codigo=cod;
	  gotoxy(25,12);
	  printf("Curso: ");
	  fflush(stdin);
	  gets(datos.curso);
	  gotoxy(25,14);
	  printf("Nombre alumno: ");
	  fflush(stdin);
	  gets(datos.nombre);
	  gotoxy(25,	16);
	  printf("Edad: ");
	  fflush(stdin);
	  scanf("%d",&datos.edad);
	  gotoxy(25,20);
	  printf("Pulse una tecla para continuar");
	  getche();
	  fwrite(&datos,sizeof(struct alumno),1,fichero1);
	  fclose(fichero1);
	  break;
	}
      }
      case 2:
      {
	clrscr();
	gotoxy(25,12);
	printf("Volviendo al menu principal");
	gotoxy(25,14);
	printf("Pulse una tecla para continuar");
	fin=1;
	break;
      }
    }
  }while(fin==0);
}

void buscar(struct alumno datos)
{
  int ok,fin,opcion;
  char bus[45];
  do
  {
    fin=0;
    clrscr();
    gotoxy(25,11);
    printf("1. Buscar un alumno por nombre");
    gotoxy(25,13);
    printf("2. Salir al menu principal");
    gotoxy(25,15);
    printf("Opcion: ");
    scanf("%d",&opcion);
    switch(opcion)
    {
      default:
      {
	clrscr();
	gotoxy(28,12);
	printf("Opcion incorrecta");
	gotoxy(25,14);
	printf("Pulse una tecla para continuar");
	getche();
      }
      case 1:
      {
	clrscr();
	ok=0;
	gotoxy(20,6);
	printf("Nombre de la persona: ");
	fflush(stdin);
	gets(bus);
	fichero1=fopen("alum.dat","r+b");
	fread(&datos,sizeof(struct alumno),1,fichero1);
	while(!feof(fichero1) && ok==0)
	{
	  if(strcmp(bus,datos.nombre)==0)
	  {
	    gotoxy(25,9);
	    printf("Codigo: %d",datos.codigo);
	    gotoxy(25,11);
	    printf("Curso. ");
	    puts(datos.curso);
	    gotoxy(25,13);
	    printf("Edad: %d",datos.edad);
	    gotoxy(20,18);
	    printf("Pulse una tecla para continuar");
	    getche();
	    ok=1;
	  }
	  else
	  {
	    fread(&datos,sizeof(struct alumno),1,fichero1);
	  }
	  if(feof(fichero1) && ok==0)
	  {
	    ok=1;
	    gotoxy(20,10);
	    printf("No hay ningun nombre que concuerde");
	    gotoxy(20,12);
	    printf("Pulse una tecla para continuar");
	    getche();
	  }
	}
	fclose(fichero1);
	break;
      } //fin case 1
      case 2:
      {
	clrscr();
	gotoxy(25,12);
	printf("Volviendo al menu principal");
	gotoxy(25,14);
	printf("Pulse una tecla para continuar");
	fin=1;
      }
    } //fin switch
  }while(fin==0);

}

void borrar(struct alumno datos)
{
  int fin,opcion, cod,ok=0;
  do
  {

fin=0;
clrscr();
gotoxy(25,11);
printf("1. Borrar un alumno por codigo");
gotoxy(25,13);
printf("2. Salir al menu principal");
gotoxy(25,15);
printf("Opcion: ");
scanf("%d",&opcion);
switch(opcion)
{
  default:
  {
clrscr();
gotoxy(28,12);
printf("Opcion incorrecta");
gotoxy(25,14);
printf("Pulse una tecla para continuar");
getche();
break;
  }
  case 1:
  {
clrscr();
gotoxy(20,6);
printf("Codigo de la persona: ");
fflush(stdin);
scanf("%d",&cod);
fclose(fichero1);
fichero1=fopen("alum.dat","rb");
if(fichero1==NULL)
{
  clrscr();
  printf("Error en la apertura");
}

//fichero2=fopen("aux.dat","wb");
//fclose (fichero2); -> abro y cierro para comprobar que no falla en la apertura/cierre
fichero2=fopen("aux.dat","wb");
if(fichero2==NULL)
{
  clrscr();
  printf("Error en la apertura");
}
fread(&datos,sizeof(struct alumno),1,fichero1);
while(!feof(fichero1))
{
  if(cod==datos.codigo)
  {
    gotoxy(25,9);
    printf("Nombre: ");
    puts(datos.nombre);
    gotoxy(25,11);
    printf("Curso. ");
    puts(datos.curso);
    gotoxy(25,13);
    printf("Edad: %d",datos.edad);
    gotoxy(25,15);
    printf("Este alumno va a ser elimiando de la base");
    gotoxy(25,18);
    printf("Pulse una tecla para continuar");
    getche();
    ok=1;
  }
  else
  {
    printf("DEBUG \n");
    //fprintf(fichero2,"%s",datos.nombre); Prueba para ver si da error tmb con fprintf. DA ERROR -_-
    fwrite(&datos,sizeof(struct alumno),1,fichero2); //
  }
  fread(&datos,sizeof(struct alumno),1,fichero1);
}
if(feof(fichero1) && ok==0)
{
  gotoxy(20,10);
  printf("No hay ningun nombre que concuerde");
  gotoxy(20,12);
  printf("Pulse una tecla para continuar");
  getche();
}
fclose(fichero1);
fclose(fichero2); // Al cerrar el fichero2 tmb da error
remove("alum.dat");
rename("aux.dat","alum.dat");
break;
  } //fin case 1
  case 2:
  {
clrscr();
gotoxy(25,12);
printf("Volviendo al menu principal");
gotoxy(25,14);
printf("Pulse una tecla para continuar");
fin=1;
break;
  }
} //fin switch
  }while(fin==0);
}
void ver(struct alumno datos)
{
  struct alumno ordenar[100];
  int num=0,i,j,k;
  fichero1=fopen("alum.dat","r+b");
  fread(&datos,sizeof(struct alumno),1,fichero1);
  while(!feof(fichero1))
  {
    ordenar[num]=datos;
    num++;
    fread(&datos,sizeof(struct alumno),1,fichero1);
  }
  for(i=0;i<num;i++)
  {
    for(j=i+1;j<num;j++)
    {
      strcpy(ordenar[99].nombre,"                           	      ");
      strcpy(ordenar[99].curso,"    ");
      if(ordenar[i].edad>ordenar[j].edad)
      {
	ordenar[99]=ordenar[j];
	ordenar[j]=ordenar[i];
	ordenar[i]=ordenar[99];
      }
    }
  }
  for(i=0;i<num;i++)
  {
    clrscr();
    gotoxy(25,9);
    printf("Codigo: %d",ordenar[i].codigo);
    gotoxy(25,11);
    printf("Curso: ");
    puts(ordenar[i].curso);
    gotoxy(25,13);
    printf("Nombre: ");
    puts(ordenar[i].nombre);
    gotoxy(25,15);
    printf("Edad: %d",ordenar[i].edad);
    gotoxy(25,20);
    printf("Pulse una teclar para continuar");
    getche();
  }
}

void main()
{
  struct alumno datos;
  clrscr();
  int i,fin=0,opcion;
  do
  {
    clrscr();
    gotoxy(22,3);
    printf("Base de datos de alumnos");
    gotoxy(25,6);
    printf("Que desea hacer");
    gotoxy(15,8);
    printf("1. Crear y almacenar informacion en el archivo 'alum.dat'");
    gotoxy(15,10);
    printf("2. Visualizar el contenido del fichero 'alum.dat'");
    gotoxy(15,12);
    printf("3. A€adir nuevos datos al fichero (al final del fichero)");
    gotoxy(15,14);
    printf("4. Borrar un determinado registro buscando por el codigo");
    gotoxy(15,16);
    printf("5. Buscar un registro especifico (buscar por nombre");
    gotoxy(15,18);
    printf("6. Visualiza el fichero ordenado por edad");
    gotoxy(15,20);
    printf("7. Salir de la aplicacion");
    gotoxy(20,22);
    printf("Mi opcion es : ");
    fflush(stdin);
    scanf("%d",&opcion);
    switch(opcion)
    {
      default:
	clrscr();
	gotoxy(28,12);
	printf("Opcion erronea");
	gotoxy(25,14);
	printf("Pulse una tecla para continuar");
	getche();
	break;
      case 1:
	crear(datos);
	getche();
	break;
      case 2:
	visualizar(datos);
	getche();
	break;
      case 3:
	anadir(datos);
	getche();
	break;
      case 4:
	borrar(datos);
	getche();
	break;
      case 5:
	buscar(datos);
	getche();
	break;
      case 6:
	ver(datos);
	break;
      case 7:
	fin=1;
	gotoxy(25,24);
	printf("Hasta la proxima");
	delay(1500);
	break;
    }
  }while(fin==0);
  getche();
}
elkaoD

Dios, no entiendo nada,con Dev-C++ me da un error de que la memoria no se puede escribir en ese puntero, pero qué cojones.

ExTiNcT_

Por lo que entiendo no te deja sobreescribir en el fichero no? Esque me lo he leido por encima.

Esto se debe creo, a que abres el fichero en "a", abrelo en "r+w" por ejemplo, luego situate donde quieras sobreescribir y intentalo, esto tendria que funcionar.

elkaoD

He conseguido que funcione con Dev-C++ y va perfectamente. Es cosa de Borland o de un par de bugs que tenías en la función crear.

http://pastebin.com/f4b414762

De todas formas tienes un bug. Cuando borras una entrada, por alguna razón te borra el fichero entero. De hecho ni siquiera crea un aux.dat. Incluso aunque no encuentre a la persona, borra todo el fichero.

El resto funciona perfectamente.

Y si fuera tú, pondría lo de crear el archivo.dat sólo si no existe.

EDIT: Para comprobar si se ha abierto bien no hace falta cerrar. If valorderetorno == NULL, ha fallado

NecroFox

#9 voy a mirar pero creo que no lo tengo ^^

EDIT: BIIIIIIIIIIIIIIIIP!!!!!! Error!!! No los tengo jajaja tengo hasta la lista seis, el resto al final de curso los debi de borrar sorry :(, no se que co**nes debi de hacer...

Usuarios habituales

  • NecroFox
  • elkaoD
  • ExTiNcT_
  • Santii
  • PirLo_21