[c] naruszenie pamięci

robin5hood
Użytkownik
Użytkownik
Posty: 1676
Rejestracja: 2 kwie 2007, o 14:43
Płeć: Mężczyzna
Lokalizacja: warszawa
Podziękował: 178 razy
Pomógł: 17 razy

[c] naruszenie pamięci

Post autor: robin5hood »

Po wybraniu opcji Delete i usunieciu linii, dy chce wybrać inną opcję wyskakuje komunikat

Kod: Zaznacz cały

naruszenie pamięci
a to kod

Kod: Zaznacz cały

#include<stdio.h>
#include<string.h>

main()
{
 FILE *t,*p;
 char another,choice;
  struct telephone
 {
  char name[30];
  long int code;
  long int number;
  };
  struct telephone data;
  char custname[30];
  long int n;
  long int recsize;

   t=fopen("TELEPHONE.DAT","rb+");
   if(t==NULL)
   {
       t=fopen("TELEPHONE.DAT","wb+");
	   if(t==NULL)
	   {
	     printf("The File can't open\n");
		 exit(0);
		 }
		 }
     printf("          TELEPHONE DIRECTORY               \n");
	 printf("          *******************               \n");

	 recsize=sizeof(data);

  while(1)
  {
	  printf("\n\n");
   printf("1.Add Records\n");
   printf("2.List Records\n");
   printf("3.Modify Records\n");
   printf("4.Finding Number\n");
   printf("5.Finding Name\n");
   printf("6.Delete Records\n");
   printf("0.Exit\n");
   printf("Your Choice:");

   fflush(stdin);
   choice=getchar();

   switch(choice)
   {
   case '1':

	   fseek(t,0,SEEK_END);

	   another='y';

	   while(another=='y')
	   {
		   printf("\nEnter Customer name,Code number and Telephone number\n");
		   scanf("%s  %ld %ld",data.name,&data.code,&data.number);
		   fwrite(&data,recsize,1,t);

		   printf("Add another data(y/n):");
		   fflush(stdin);
		   another=getchar();
		   printf("\n");
	   }
	   break;

   case '2':

	   rewind(t); 
	   printf("\n");
	   printf("---------------------------------------------\n");
	   printf("|   CUSTOMER      |   CODE   |  TELEPHONE   |\n");
       printf("---------------------------------------------\n");
       rewind(t);

	   while(fread(&data,recsize,1,t)==1)

	   printf("|  %-18s %-2ld %12ld    |\n\n",data.name,data.code,data.number);
	   printf("--------------------------------------------\n");
       getchar();
	   

	   printf("\n");
	   break;

   case '3':
	   another='y';
	   while(another=='y')
	   {
		   printf("\nEnter name of customer to modify:");
		   scanf("%s",custname);
		   rewind(t);
		   while(fread(&data,recsize,1,t)==1)
		   {
			   if(strcmp(data.name,custname)==0)
			   {
				   printf("\nEnter new name,code and telephone number\n");
				   scanf("%s %ld &ld",data.name,&data.code,&data.number);

				   fseek(t,-recsize,SEEK_CUR);
                   fwrite(&data,recsize,1,t);
				   break;
			   }
		   }
		   printf("Modify another record(y/n):");
				   fflush(stdin);
				   another=getchar();
				   printf("\n");
	   }

	   break;


   case '4':

	   another='y';
	   while(another=='y')
	   {
	   printf("\nEnter name of customer:");
	   scanf("%s",custname);

	   rewind(t);
	   while(fread(&data,recsize,1,t)==1)
	   {
	   if(strcmp(data.name,custname)==0)
	   {
		   printf("Telephone Number=%ld %ld\n",data.code,data.number);
		   getch();
	   }
	   }
		   printf("Find another number(y/n)? ");
	   fflush(stdin);
	   another=getchar();
	   printf("\n");
	   }
	   break;

   case '5':

	   another='y';
	   while(another=='y')
	   {
		   printf("\nEnter number of customer:");
		   scanf("%ld",&n);

		   rewind(t);
		   while(fread(&data,recsize,1,t)==1)
		   {
		   if(data.number==n)
		   {
			   printf("The Name is %s\n",data.name);
			   getchar();
		   }
		   }
		   printf("Find another name(y/n)? ");
		   fflush(stdin);
		   another=getchar();
		   printf("\n");
	   }
	   break;

   case '6':

	   another='y';
	   while(another=='y')
	   {
		   printf("\nEnter name of customer to delete:");
		   scanf("%s",custname);

		   p=fopen("TEMP.DAT","wb");

		   rewind(t);
		   while(fread(&data,recsize,1,t)==1)
		   {
			   if(strcmp(data.name,custname)!=0)
				   fwrite(&data,recsize,1,p);
		   }
		   fclose(t);
		   fclose(p);

		   remove("TELEPHONE.DAT");
		   rename("TEMP.DAT","TELEPHONE.DAT");

		   t=fopen("TELEPHONE","rb+");
		        
            printf("Delete another record(y/n):");
			fflush(stdin);
			another=getchar();
	   }
	   break;


  case '0':

	   printf("\n");
	   fclose(t);
	 
	   }  
   }
   }
Moraxus
Użytkownik
Użytkownik
Posty: 223
Rejestracja: 23 lis 2008, o 18:10
Płeć: Mężczyzna
Podziękował: 3 razy
Pomógł: 79 razy

[c] naruszenie pamięci

Post autor: Moraxus »

Kod: Zaznacz cały

         remove("TELEPHONE.DAT");
         rename("TEMP.DAT","TELEPHONE.DAT");

         t=fopen("TELEPHONE","rb+");
W fopen nie powinno być TELEPHONE.DAT?
Prawdopodobnie przez to plik się nie otwiera i przy kolejnym poleceniu od użytkownika próbujesz czytać plik, który nie został poprawnie otwarty.
ODPOWIEDZ