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