Newsgroup: it.comp.lang.c
Titolo: leggere un file

salve a tutti
ho un problema.
1)
ho una struttura "persona" cosi definita
struct element
{
  char nome[30];
  char cognome[30];
  char indirizzo [60];
  struct  element *prossimo;
  struct  element *precedente;
};
gestita tramite lista doppiamente collegata
2) ho sviluppato le funzioni di inserimento, lettura, ordinamento e tutti i
possibili cavoli vari (probabilmente avete capito che e' un esercizio
universitario)
3) ho prodotto un file binario pippo.txt che è tutta la mia rubrica.
                    ******PROBLEMA********
4) come cavolo faccio a fargli leggere la rubrica su file ed inserirla
all'interno della  lista doppiamente collegata?
mi date un'idea uno spunto, insomma qualsiasi cosa va bene.
grazie  per l'aiuto
ciao

posso provare giusto a darti qualche suggerimento, perché il tutto sta
nel come hai implementato la lista e come vuoi formattare il file
struct anag {
              char nome[30],
                   cognome[30],
                   indirizzo[60];
              int eta;
            } persona;
FILE *fp;
:::::::
  fp = fopen("pippo.dat", "a+");
  if (fp == NULL){ /*errore di apertura*/
    fprintf(stderr,"Si è verificato un errore nell'apertura del
file\n");
    exit (0);
  }
:::::::
  fwrite(&persona, sizeof(struct anag), 1, fp);
:::::::
  rewind(fp);
  i=0;
  notfine= fread(&persona, sizeof(struct anag), 1, fp);
  while (notfine){ /*legge tutto il file*/
    i++;
    /*scrivi su lista*/
    /*writeList(NomeLista, pos, &persona);*/
    notfine= fread(&persona, sizeof(struct anag), 1, fp);
  }
  fclose(fp);
probabilmente l'Item della lista sarà un puntatore, quindi tocca a te
adattare il  tutto.
Se i campi non hanno una lunghezza allora questa forma non la puoi
usare, dovresti organizzarti il file in modo da mettere un carattere
separatore per i campi, ad esempio se usi come carattere sentinella
'^' un esempio potrebbe essere:
= = = =
  int i=0;
  do
    strcpy(persona->cognome[riga++], fstring(fp));
    strcpy(persona->nome[riga++], fstring(fp));
    fscanf(fp, "%d", &eta); /*legge direttamente l'intero*/
    /*fprintf(fp, "%s", &persona->cognome) leggerebbe fino allo
spazio*/
    /*SCRIVI SU LISTA*/
    /*writeList(NomeLista, pos, persona);*/
  while(!feof(fp));
  close(fp);
= = = =
char *fstring(FILE *finp)
{
  int i= 0;
  char c, *testo;
  c= fgetc(finp);
  while (c !=EOF && c!='\n' && c!='^'){ /*legge fino al carattere
sentinella*/
    testo[i++]= c;
    c= fgetc(finp);
  }
  testo[i]='\0'; /*devi mettere tu il carattere di fine stringa*/
  return testo;  /*ritorna la stringa letta*/
}
non ho capito se intendevi questo. A quanto ho capito l'inserimento
nella lista l'hai fatto, quindi devi leggere da file e inserire nella
lista con la tua funzione.
altrimenti ecco anche un esempio di inserimente
  typedef struct {
                  char *cognome;
                       *nome;
                  int eta;
                 } TypeItem, *TElem; /*tipo elem. della lista*/
  typedef struct typepos{
               TypeItem item;
               struct typepos *pred;
               struct typepos *next;
             } *pos; /*puntatore al nodo*/
  typedef struct {
              pos first;
              int ItemsNumbers; /*Numero di elem. nella lista*/
             } *TList; /*tipo lista*/
::::
/*Primitive constructor: Crea un nuovo nodo, assegnando a item il
valore*
 *AnItem passato e NULL ai campi puntatore next e pred                
 */
static pos MakeNode(TElem AnItem)
{
  pos node;
  if ((node= (pos) malloc(sizeof (struct typepos))) == NULL) {
    fprintf(stderr,"Not enough memory to allocate buffer\n");
    exit(1);  /* termina il programma */
  }
  node->item=*AnItem;
  node->pred=NULL;
  node->next=NULL;
  return node;
}
/*Inserisce un Nodo con campo AnItem nella lista Alist.             *
 *Il nodo è inserito subito dopo il nodo che ha come puntatore Pred *
 *Se Pred=NIL allora il nodo sarà il primo della lista              */
void InsertList(TElem AnItem, pos preced, TList AList)
{
   pos px;
   px= MakeNode(AnItem);     /*crea il nodo Temp*/
   if (preced==NULL) { /*in questo caso Temp sarà il primo nodo della
lista*/
       px->next= AList->first;
       AList->first=px;
   }
   else {
       px->next= preced->next;
       px->pred= preced;
       preced->next=px;
   }
   AList->ItemsNumbers=AList->ItemsNumbers+1;
} 
spero di esserti stato d'aiuto, almeno c'ho provato.
infondo avevi detto che qualsiasi cosa andava bene
ciaociao

 infondo avevi detto che qualsiasi cosa andava bene
grazie mille per il tuo aiuto
non so come ringraziarti !
ciao
M.