Per evitare di creare confusione adesso posto tutto il codice e spiego meglio.
codice:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
FILE *p;
struct alunno {
char nome[20];
char cognome[20];
char titolo[30];
struct alunno * succ;
};
struct alunno * ins_ord(struct alunno * t, char nome[], char cognome[], char titolo[]){
struct alunno * tmp = t;
struct alunno * p;
p = (struct alunno *) malloc(sizeof(struct alunno));
if( tmp == NULL || (strcmp(cognome, (*tmp).cognome) == -1)){
strcpy((*p).cognome, cognome);
strcpy((*p).nome, nome);
strcpy((*p).titolo, titolo);
(*p).succ = t;
return(p);
}
else{
while((*tmp).succ != NULL)
{
tmp = (*tmp).succ;
}
if(strcmp(cognome, (*tmp).cognome) > 0){
strcpy((*p).cognome, cognome);
strcpy((*p).nome, nome);
strcpy((*p).titolo, titolo);
(*p).succ = NULL;
(*tmp).succ = p;
return(t);
}
else{
tmp = t;
while(!(strcmp(cognome, (*tmp).cognome) > 0 && strcmp(cognome, (*(*tmp).succ).cognome) < 0))
tmp = (*tmp).succ;
strcpy((*p).cognome, cognome);
strcpy((*p).nome, nome);
strcpy((*p).titolo, titolo);
(*p).succ = (*tmp).succ;
(*tmp).succ = p;
return(t);
}
}
}
void salva_file(struct alunno *t){
p = fopen("file.txt", "w");
while(t != NULL){
fprintf(p, "%s ", (*t).cognome);
fprintf(p, "%s \n", (*t).nome);
fprintf(p, "%s \n", (*t).titolo);
puts((*t).cognome);
t = (*t).succ;
}
puts("\nDati salvati\n");
fclose(p);
}
struct alunno * cancella(struct alunno * t){
char cognome[20];
struct alunno* p = t;
struct alunno* testa = t;
puts("cognome di chi cancellare:");
fflush(stdin);
gets(cognome);
fflush(stdin);
t = (*t).succ;
while(t != NULL){
if(strcmp((*t).cognome, cognome) == 0){
(*p).succ = (*t).succ;
}
p = (*p).succ;
t = (*t).succ;
}
return(testa);
}
struct alunno* carica(){
struct alunno * t;
p = fopen("file.txt", "r");
int c = 1;
char nome[20];
char cognome[20];
char titolo[30];
while (!feof(p))
{
if(c == 1)
{
fscanf(p, "%s", nome);
c++;
}
if(c == 2)
{
fscanf(p, "%s", cognome);
c++;
}
if(c == 3)
{
fscanf(p, "%s", titolo);
t = ins_ord(t, nome, cognome, titolo);
c = 1;
}
}
return(t);
}
void main()
{
int scelta = 9;
struct alunno* testa = NULL;
char nome [20];
char cognome [20];
char titolo[30];
while(scelta > 0)
{
puts("1) Carica dati da file\n2) Salva dati su file\n3) Inserisci nuovo prestito\n4) Cancella prestito\n0) Esci\n\n");
scanf("%d", &scelta);
if(scelta == 1)
{
testa = carica();
}
if(scelta == 2)
{
salva_file(testa);
}
if(scelta == 3)
{
puts("Inserisci il nome");
fflush(stdin);
gets(nome);
puts("Inserisci il cognome");
fflush(stdin);
gets(cognome);
puts("Inserisci il titolo");
fflush(stdin);
gets(titolo);
testa = ins_ord(testa, nome, cognome, titolo);
}
if(scelta == 4)
{
testa = cancella(testa);
}
}
}
Questo è tutto il codice, ho una lista e devo prevedere il salvataggio e il caricamento della stessa su/da file.
Praticamente io ho già creato la funzione di salvataggio e funziona (è abbastanza semplice in fondo), ma non ho idea di come fare il caricamento, perché sul file gli elementi si presentano in questo modo:
Nome Cognome Libro
Nome1 Cognome1 Libro1
Nome2 Cognome2 Libro2
ecc..
E non so come fare perché fossero tutti la stessa cosa metterei uno fscanf fino alla fine del file e salverei da qualche parte ogni volta che si ripete il ciclo, mentre io dovrei fare che la prima volta prende il nome, la seconda il cognome e la terza il libro e così a ripetersi fino alla fine del file.
Il codice che ho scritto io non funziona.