Creazione Lista da File

di il
5 risposte

Creazione Lista da File

Ragazzi Buongiorno,

voglio creare un programmino, ma credo ci siano dei problemi nel creare una lista da file. Ho provato a fare una stampa ogni qualvolta registro un utente ma ci sono problemi.

MAIN.C
//Librerie

#include "utenti.h"
#include "util.h"

int main(){
	
	titolo();
    
    utente *testa_Utente = NULL;
    
    //Lettura utenti dal file
    FILE *fpU;
    fpU = fopen("utenti.csv", "r");
    testa_Utente = lettura_Utenti(fpU);
    fclose(fpU);
	
	int scelta;
	
	do {
        
        printf("\t \t \t 1. Login \n \n");
        printf("\t \t \t 2. Registrazione \n \n");
        printf("\t \t \t 3. Stampa Utenti \n \n");
        printf("\t \t \t \t Scelta : ");
        scanf("%d", &scelta);
        
        //Ripulisco la schermata
        clear_Console();
        titolo();
        
        switch (scelta) {
        	             
			/* REGISTRAZIONE Utente */   
            case 2:
            	printf("Benvenuto! \n Crea il tuo account \n");
                registrazione_utente(testa_Utente);
                clear_Console();
                titolo();
                break;
            
            case 3:
            	printf("Stampa Lista \n");
                fpU = fopen("utenti.csv", "r");
    			testa_Utente = lettura_Utenti(fpU);
    			fclose(fpU);
    			
    			while(testa_Utente!=NULL){
    				printf("%s \n",testa_Utente->nome);
    				testa_Utente = testa_Utente -> next_Utente;
    				pausa();
				}
    			
    			//STAMPA LISTA
                clear_Console();
                titolo();
                break; 
                
            default:
                clear_Console();
                titolo();
                break;
        }
        printf("-----------------------------\n");
        
    } while (scelta != 0);
    
    printf("\n");
    return 0;

    
    registrazione_utente(testa_Utente);
        
}

UTENTI.H
/* utenti.h */

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <windows.h>

#define BUFFER_SIZE 1024
#define Char_size 20

//Definizione struct UTENTE	
struct utente {
    char nome[Char_size];
    struct utente *next_Utente; //puntatore al prossimo nodo
};
typedef struct utente utente;

utente *lettura_Utenti(FILE *fp);

void registrazione_utente (utente *testa);
UTENTI.C
/* utenti.c */

#include "utenti.h"

/*
 * Function: lettura_Utenti
 * ----------------------------
 *   Permette di leggere i dati dal file "utenti.csv" e salvarli all'interno della struct Utente
 *
 *   @param fp puntatore alla variabile di tipo FILE, precedentemente configurata, che punta al file utenti.csv
 *
 *   @return puntatore alla variabile di tipo Utenti, una lista contenente tutte gli utenti
 */
utente* lettura_Utenti(FILE* fp) {
	
	utente *nodo;
	utente *testa = NULL;
	
    char t_nome[Char_size];
        
    while(!fscanf(fp, "%s", t_nome)){
    	
    	nodo = (utente *) malloc(sizeof(utente));
		
		strcpy(nodo -> nome, t_nome); 
    	    	
    	//Aggiorno Collegamenti LISTA
    	nodo -> next_Utente = testa;
    	testa = nodo;
	}

	return(testa);	
}


/*
 * Funzione: registrazione_utente
 * ----------------------------
 *   Permette la registrazione di un nuovo utente, con salvatggio dei dati sul file "utenti.csv" nella struct utente
 *
 *   @param testa : puntatore all'inizio lista utenti, una lista contenente tutte gli utenti caricati dal file "utenti.csv"
 */
 void registrazione_utente (utente *testa) {
    
	// Puntatori a variabili tipo utente : Salvataggio in TESTA alla lista
	utente *nuovo_Nodo;
    utente *temp;
    utente *curr, *prec;
    prec = NULL;
    curr = testa;

    nuovo_Nodo = (utente *)malloc(sizeof(utente));
	
    int ultimoID = 0, i; 
	
	//flag test_Input = TRUE : errore inserimento
    bool test_Input = false; 
    bool continua_Inserimento = true;
    //flag per controllare univocità del campo nickname
	bool flag = false; 
	
    
    // Apertura File con lista utenti
    FILE *fp;
    fp = fopen("utenti.csv", "a+");
    
    while ('\n' != getchar());

    // notifica_Annulla();

	/* Inserimento NOME */
    do {
        test_Input = false;
        puts("\n \t \t \t Benvenuto! Crea il tuo account \n");
        printf("\t \t \t Nome: ");
        fgets(nuovo_Nodo -> nome, Char_size, stdin);
        
        // Prima lettera in MAIUSCOLO e ultimo carattere è 0
        nuovo_Nodo->nome[strlen(nuovo_Nodo -> nome) - 1] = 0;
        nuovo_Nodo->nome[0] = toupper(nuovo_Nodo -> nome[0]);
		
		// Campo Nome non compilato
        if (strlen(nuovo_Nodo -> nome) == 0) {
            continua_Inserimento = false;
            clear_Console();
            titolo();
            break;
        }
		
		// Controllo su NOME
        for (i = 0; i < strlen(nuovo_Nodo -> nome); i++) {
            if (isalpha(nuovo_Nodo -> nome[i]) == 0 && nuovo_Nodo -> nome[i] != ' ') {
				//Carattere non alfabetico, imposto il test_Input su true (è sufficiente che sia vera una volta per constatare l'errore)
				test_Input = true; 
            }
        }

        if (test_Input == true) {
            clear_Console();
            titolo();
            puts("\t \t \t ----------");
            printf("\t \t \t Attenzione!");
            puts("\t \t \t \n Nome non valido.");
            puts("\t \t \t -----------------------------");
        }

    } while (test_Input == true); // WHILE cicla per vero
    
    // Verifico se nel file ci sono utenti registrati (LISTA VUOTA o LISTA NON VUOTA)
    fseek(fp, 0, SEEK_END); // Posiziono puntatore alla fine del file
    long size = ftell(fp); // distanza tra inizio del file e fine del file
    
    // File VUOTO o File NON VUOTO
    if (size == 0) {
        nuovo_Nodo -> next_Utente = NULL;
		testa = nuovo_Nodo;
    } else {
    	nuovo_Nodo -> next_Utente = testa;
		testa = nuovo_Nodo;
	}
	
    fprintf(fp, "%s \n", nuovo_Nodo -> nome);
                    
		
    fclose(fp);
        
	clear_Console();
    titolo();
    printf("\t \t \t Registrazione avvenuta con successo.\n \n ");
    printf("\t \t \t Benvenuto/a %s. \n \n", nuovo_Nodo -> nome);
    pausa(); 
        }
Grazie come sempre e scusatemi per il fastidio

5 Risposte

  • Re: Creazione Lista da File

    Ma che problemi? Spiegati meglio
  • Re: Creazione Lista da File

    Ciao Oregon,

    In primis voglio ringraziarti per la pazienda ed il supporto in questi giorni.

    Secondo me ci sono dei problemi in "lettura_Utenti". Ogni qualvolta creo la lista leggende il file utenti.csv e la stampo non mi stampa nulla a video.
  • Re: Creazione Lista da File

    Sicuro di avere aperto il file e che sia nella cartella giusta? Controlla il valore di fp
  • Re: Creazione Lista da File

    Si, sono sicuro anche perché riesco a salvare i valori sul file e riesco a stampare l ultimo elemento. Non so se ho sbagliato qualcosa dal punto di vista del codice. L ho rivisto diverse volte e mi sembra corretto.
  • Re: Creazione Lista da File

    Nel ciclo deve essere

    while( fscanf(fp, "%s", t_nome) != EOF ) {
Devi accedere o registrarti per scrivere nel forum
5 risposte