Testo:
Scrivere un programma C che legga da un file di testo "persone.txt" tutti i dati contenuti all'interno, che sono del tipo "nome cognome eta" come nel seguente esempio:
Matteo Pupo 20
Asdrubale Pinco 16
Genoveffa Croce 25
Steve Jobs 56
Mario Rossi 14
Il programma deve creare un array di strutture (allocato dinamicamente con la dimensione necessaria) e successivamente deve stampare a video l'array di strutture così creato, infine deve stampare a video il nome, il cognome ed età della persona, o delle persone se sono più di una, di età massima.
Si assuma che di alcune persone si possa essere ignota l'eta, nel qual caso il dato memorizzato deve essere pari al valore "1000".
Il file txt è il seguente
Matteo Pupo 20
Asdrubale Pinco 16
Genoveffa Croce 25
Steve Jobs 56
Mario Rossi 14
struct:
struct persona{
char nome[LEN + 1];
char cognome[LEN + 1];
int eta;
struct persona *next;
};
main:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//definizioni di tipo
#define NOME_FILE "persone.txt"
#define ETA_MANCANTE 1000
#define LEN 22
struct persona{
char nome[LEN + 1];
char cognome[LEN + 1];
int eta;
struct persona *next;
};
struct persona *list = NULL; //creo una lista
//prototipi di funzione
void riempilista(struct persona** list, FILE* in);
void stampalista(struct persona* list);
//int etamassina(struct persona* list);
//void cercostampo(struct persona* list, int etamax);
int main(int argc, char *argv[])
{
FILE *in; // dichiaro un puntatore a file
// int etamax;
in = fopen(NOME_FILE, "r"); //apro il file in lettura binaria
if(in == NULL) // controllo apertura file
{
printf("Il file %s non può essere aperto!\n", NOME_FILE);
exit(EXIT_FAILURE);
}
else // il file si è aperto correttamente
{
riempilista(&list, in);
stampalista(list);
/* printf("\n\nLe persone con eta' massima sono: \n");
etamax = etamassina(list);
cercostampo(list, etamax);*/
fclose(in);
}
return 0;
}
Funzione riempilista:
void riempilista(struct persona** list, FILE* in)
{
struct persona *new_node; // creo un nuovo nodo
*list = malloc(sizeof(struct persona)); // alloco la memoria dinamicamente per il nuovo nodo
new_node = *list;
char str[LEN * 3];
char* token;
do
{
//leggo i dati e li salvo nella lista
fgets(str, sizeof(str), in);
//suddivido la stringa in parole
token = strtok(str, " ");
printf("La stringa è': %s\n", token);
strcpy(new_node->nome, token);
token = strtok(NULL, " ");
printf("La stringa è': %s\n", token);
// strcpy(new_node->cognome, token);
token = strtok(NULL, " ");
printf("La stringa è': %s\n", token);
//controllo se il campo eta è vuoto
// if(isspace(token))
// new_node->eta = 1000;
// else
// new_node->eta = atoi(token);
if(feof(in))
new_node->next = NULL;
else
{
new_node->next = malloc(sizeof(struct persona));
new_node = new_node -> next;
}
}while(!feof(in));
}
Funzione stampa lista:
void stampalista(struct persona* list)
{
printf("_______________________________");
while (list != NULL)
{
printf("%s %s %d\n", list->nome, list->cognome, list->eta);
list = list -> next;
}
}
ho inserito le stringhe :
printf("La stringa è': %s\n", token);
per verificare se il token andava bene.. è sembra che funzioni...
ma non appena decommento la seconda copia di stringa:
strcpy(new_node->cognome, token);
se eseguo il programma mi esce la scritta
"Segmentation fault (core dumped)" e devo chiudere l'applicazione.
Non so in cosa sbaglio..
Grazie per gli eventuali aiuti