Oppure

Loading
25/11/11 17:22
mimmo91
salve,
vorrei implementare oltre a queste funzioni riportate nel codice, anche la funzione di cancellazione di un contatto dalla rubrica, quindi dal file.txt creato.
mi dareste una mano???

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define dim 35

typedef struct nodo *node_pointer;
typedef struct nodo {
                     char cognome[dim];
		     char nome[dim];
                     char numero[dim];
                     node_pointer link_sx;
                     node_pointer link_dx;
                     } nodo;

node_pointer davanti=NULL, dietro=NULL;
int n;
char str1[dim], str2[dim], str3[dim];

void insert(node_pointer *, node_pointer *);
void print(node_pointer);
void modifica(node_pointer);
void trova(node_pointer);
void scorri(void);

main()
{
int scelta=-1;
FILE *fp;
fp=fopen("rubr.txt", "r+");
if(!fp)
	{
   fp=fopen("rubr.txt", "w");
   }
else
	{
   while(!feof(fp))
   	{
   	fscanf(fp, "%s %s %s ", str1, str2, str3);
      insert(&davanti, &dietro);
      }
   rewind(fp);
   }
n=0;
printf("\n\t\t\tRUBRICA\n");
while(scelta)
	{
   printf("\n\n\n\t(1)\tInserisci nuovo contatto\n\t(2)\tModifica contatto\n\t(3)\tVisualizza contatto singolo\n\t(4)\tScorri rubrica\n\t(0)\tEsci dal programma\n\nSeleziona la tua scelta: ");
   scanf("%d", &scelta);
   switch(scelta)
   	{
      case 1:  printf("\n\tNUOVO CONTATTO\n\n");
      			printf("\nInserisci cognome: ");
               scanf("%s", str1);
               printf("\nInserisci nome: ");
					scanf("%s", str2);
               printf("\nInserisci numero: ");
					scanf("%s", str3);
      			insert(&davanti, &dietro);
      			break;
      case 2:  printf("\n\tMODIFICA CONTATTO\n\n");
      			modifica(davanti);
               scelta=2;
      			break;
      case 3:  printf("\n\tVISUALIZZA UN CONTATTO\n\n");
      			trova(davanti);
      			break;
      case 4:  printf("\n\tSCORRI RUBRICA\n\n");
               scorri();
               scelta=4;
      			break;
      case 0:	break;
      default:	printf("\n\nScelta errata! Seleziona nuovamente la tua scelta\n");
      			scelta=-1;
               break;
      }
   }
while(!feof(fp) && davanti)
	{
	fprintf(fp, "%s %s %s\n", davanti->cognome, davanti->nome, davanti->numero);
   davanti=davanti->link_dx;
   }
fclose(fp);
fflush(stdin);
getchar();
}

void insert(node_pointer *davanti, node_pointer *dietro)
{
node_pointer ptr, temp=(node_pointer)malloc(sizeof(nodo));
if(!temp)
	{
   printf("\nMEMORIA PIENA!");
   exit(1);
   }
n++;
strcpy(temp->cognome, str1);
strcpy(temp->nome, str2);
strcpy(temp->numero, str3);
if(!*davanti)
	{
   temp->link_sx=NULL;
   temp->link_dx=NULL;
   *davanti=temp;
   *dietro=temp;
   }
else
	if(strcmp((*davanti)->cognome, temp->cognome)>0)
   	{
      temp->link_sx=NULL;
      temp->link_dx=*davanti;
      (*davanti)->link_sx=temp;
      *davanti=temp;
      }
   else
   	{
   	ptr=*davanti;
      while(ptr->link_dx && (strcmp(ptr->link_dx->cognome, temp->cognome))<0)
      	ptr=ptr->link_dx;
      if(!ptr->link_dx)
      	{
         temp->link_sx=*dietro;
         temp->link_dx=NULL;
         (*dietro)->link_dx=temp;
         *dietro=temp;
         }
      else
      	{
         temp->link_sx=ptr;
         temp->link_dx=ptr->link_dx;
         ptr->link_dx=temp;
         }
		}
}

void print(node_pointer ptr)
{
if(!ptr)
	printf("\nRubrica vuota!");
else
	while(ptr)
   	{
      printf("\n%15s%15s%15s", ptr->cognome, ptr->nome, ptr->numero);
      ptr=ptr->link_dx;
      }
}

void modifica(node_pointer ptr)
{
char scegli;
if(!ptr)
	printf("\nRubrica vuota!");
else
	{
   printf("\nInserisci cognome: ");
   scanf("%s", str1);
   printf("\nInserisci nome: ");
   scanf("%s", str2);
   while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
   	ptr=ptr->link_dx;
   if(!ptr)
   	printf("\nContatto assente!");
   else
   	{
      printf("\nContatto: %s %s %s\n", ptr->cognome, ptr->nome, ptr->numero);
      printf("\nVuoi modificare il cognome?(s/n) ");
      scanf("%1s", &scegli);
      if(scegli!='n')
      	{
         printf("\nInserisci nuovo cognome: ");
         scanf("%s", str1);
         strcpy(ptr->cognome, str1);
         }
      printf("\nVuoi modificare il nome?(s/n) ");
      scanf("%1s", &scegli);
      if(scegli!='n')
      	{
         printf("\nInserisci nuovo nome: ");
         scanf("%s", str1);
         strcpy(ptr->nome, str1);
         }
      printf("\nVuoi modificare numero?(s/n) ");
      scanf("%1s", &scegli);
      if(scegli!='n')
      	{
         printf("\nInserisci nuovo numero: ");
         scanf("%s", str1);
         strcpy(ptr->numero, str1);
         }
      }
   }
}

void trova(node_pointer ptr)
{
printf("\nInserisci cognome: ");
scanf("%s", str1);
printf("\nInserisci nome: ");
scanf("%s", str2);
while(ptr && (strcmp(str1, ptr->cognome)!=0 || strcmp(str2, ptr->nome)!=0))
	ptr=ptr->link_dx;
if(!ptr)
	printf("\nContatto assente!");
else
	printf("\n%s %s %s", ptr->cognome, ptr->nome, ptr->numero);
}

void scorri(void)
{
char scegli;
node_pointer ptr=davanti;
while(scegli!='0')
   {
	printf("\n%s %s %s\n\nVuoi andare al precedente(p) al successivo(s) o uscire(0)? ", ptr->cognome, ptr->nome, ptr->numero);
   scanf("%1s", &scegli);
   switch(scegli)
   	{
      case 'p':   if(ptr==davanti)
      					printf("\nNon ci sono contatti precedenti!");
      				else
                  	ptr=ptr->link_sx;
      				break;
      case 's':   if(ptr==dietro)
      					printf("\nNon ci sono contatti successivi!");
      				else
                  	ptr=ptr->link_dx;
      				break;
      case '0': 	break;
      default:    scegli='a';
      }
   }
}
aaa
25/11/11 17:47
gigisoft
Salve,

non credo che sia possibile eliminare una riga da un file di testo;
cosi' su due piedi mi vengono in mente due soluzioni:

1) quando devi cancellare un contatto, semplicemente trascrivi tutti gli altri in un file temporaneo, poi cancelli l'originale, e rinomini il file temporaneo;

2) nel caso laprocedura 1 fosse troppo onerosa (se nella rubrica ci sono parecchi contatti) prova cosi'; quando devi cancellare un contatto semplicemente lo modifichi per "marcarlo" in modo che risulti cancellato, poi puoi usare la procedura 1 saltuariamente per pulire la rubrica dalle righe cancellate, oppure prevedere la possibilita', all'atto di nuovi inserimenti, di riutilizzare le righe marcate.

Solo una curiosita' perche' usi un file di testo quando sarebbe parecchio piu' comodo usare un file di dati?

Ciao. :k:
aaa
25/11/11 18:13
Bonny
quoto la prima soluzione ovvero
1) apri il file in lettura
2) crei la lista escludendo il record che vuoi eliminare
3) close(file)
4) apri il file il modalita scrittura (W) in tal modo da eliminare il contenuto
5) scrivi la lista sul file
aaa
25/11/11 18:23
mimmo91
per gigisoft non utilizzo un file di dati perchè questo è un esame che devo fare per l'università, e il prof ci ha imposto di usare un file di testo.
grazie ad entrambi :)
se non disturbo mi potete fare un esempio pratico della prima soluzione? grazie mille :)
aaa
25/11/11 18:29
Bonny
Dai mimmo91 !!!!!
ho scritto passo passo quello che devi fare non sembra cosi difficile:yup:

ti posto questo mio sorgente trovi tutto quello che ti serve
studia la tecnica che ho addoperato non fare copy&paste:(:(

pierotofy.it/pages/sorgenti/dettagli/18720-Gestione_liste_e_file_binari/
aaa
25/11/11 18:48
gigisoft
Allora, praticamente:

1) apri il file in lettura
e gia' lo fai

2) trascrivi ogni contatto dal file origine in uno di appoggio
si tratta, per ogni contatto, di leggerlo da un file e inserirlo in coda a un altro, e gia' lo fai

3) chiudi il file origine e lo cancelli
e gia' lo sai fare (spero, se no ristudiati la gestione dei file ;) )

4) Rinomina il file di appoggio col nome che aveva il file originale
e gia' lo sai fare (spero, se no, ti rimando al consiglio del punto 3)

combina il tutto in una functio e il gioco e' fatto.

Ciao. :k:
aaa
26/11/11 10:32
mimmo91
grazie ancora ad entambi :)
tranquillo studierò tutto per bene sennò il prof mi boccia ;)
Ultima modifica effettuata da mimmo91 26/11/11 10:32
aaa