PDA

Visualizza la versione completa : [C] Errore acquisizione dati da file di testo


Vincent
07-11-2006, 18:41
Ho un problema, ma non riesco a capire dove sbaglio...

Ho un file di testo formattato nel modo seguente:

ID: 1
COGNOME: Rossi
NOME: Mario

ID: 2
COGNOME: Verdi
NOME: Giovanni

...
...
...

etc.

ho buttato gi qualche linea di codice per acquisire le informazioni dal file nella mia struttura dati array...ma mi va in segmentation fault e non capisco perch...

HELPPP!


#include "Agenda.h"

void Read( AGENDA **Agenda, int *ID )
{

FILE *fpAGENDA;

char FileName[16],
strbuff[64];

AGENDA *Temp;

int ContID;

Temp=*Agenda; /* Copio l'Agenda attuale in un'Array Temp */
ContID = *ID; /* Copio il numero di Contatti Attuale in ContID */

strcpy(FileName, "Agenda.txt" );

if( ( fpAGENDA = fopen( FileName, "r" ) ) == 0 )
{
system("CLS");
printf("\n\a ERRORE: Impossibile aprire il file %s\n\n", FileName );
system("PAUSE");
system("CLS");
}
else
{

/* Alloco lo spazio necessario in memoria per inserire un nuovo NOMINATIVO */
Temp =(AGENDA*)realloc( *Agenda , (ContID+1) * sizeof( AGENDA ) );
/* Inizializzo i sotto-array NumTel, Indirizzo, Email, AltriRecapiti */
InitStruct( &Temp, ContID );

do
{

Temp =(AGENDA*)realloc( &(*Temp) , (ContID+1) * sizeof( AGENDA ) );

fscanf(fpAGENDA, "%s", strbuff);
if( strcmp(strbuff,"ID:")==0)
fscanf(fpAGENDA, "%d", &Temp[ContID].Identita.ID);

fscanf(fpAGENDA, "%s", strbuff);
if( strcmp(strbuff,"COGNOME:")==0)
fgets(Temp[ContID].Identita.Cognome, 32, fpAGENDA);

fscanf(fpAGENDA, "%s", strbuff);
if( strcmp(strbuff,"NOME:")==0)
fgets(Temp[ContID].Identita.Nome, 32, fpAGENDA);

ContID++;

}
while( !feof( fpAGENDA ) );

}

*Agenda = Temp;
*ID = ContID;

free(Temp);


}

Vincent
07-11-2006, 20:16
Ulteriore esempio di file di testo da acquisire:


ID: 1
COGNOME: Rossi
NOME: Mario

DATA DI COMPLEANNO: 30 Marzo

RECAPITI TELEFONICI:
Numero Casa
123456789

INDIRIZZI:
Casa
Via Manzoni, 28
Roma - 00010

E-MAILs:

mario.rossi@alice.it
mario.rossi@gmail.com


In grassetto sono i campi della mia struttura:

Eccoli in ordine...


Agenda[ContID].Identita.ID
Agenda[ContID].Identita.Cognome
Agenda[ContID].Identita.Nome

Array di Numeri di telefono


Agenda[ContID].Numtel[Ntel].Tel
Agenda[ContID].Numtel[Ntel].Etichetta

Array di Indirizzi


Agenda[ContID].Indirizzo[NInd].Via
Agenda[ContID].Indirizzo[NInd].NumCivico
Agenda[ContID].Indirizzo[NInd].Citta
Agenda[ContID].Indirizzo[NInd].CAP
Agenda[ContID].Indirizzo[NInd].Etichetta

devil89
07-11-2006, 20:44
L'allocazione del puntatore Temp dev'essere effettuata prima dell'istruzione:

Temp=*Agenda;

Vincent
07-11-2006, 21:05
Originariamente inviato da devil89
L'allocazione del puntatore Temp dev'essere effettuata prima dell'istruzione:

Temp=*Agenda;


L'agenda in quel momento NULL;

Quindi l'istuzione del tutto valida!

Loading