Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Allora scusami se ti rispondo dopo tanto tempo ma ho avuto molto da fare con diversi esami, comunque:
sono riuscito a leggere tutti i campi del file csv, leggo tutto il file( unico problema è che leggo 2 volte l'ultimo record ma per il momento non è un problema grave )
Il problema grave adesso è che non mi scrive mezzo rigo sul file ad accesso casuale, la fwrite non funziona anche se tutti i suoi parametri sono corretti.
Ti lascio il codice e ti faccio una copia di qualche riga del file csv
EDIT DEL MODERATORE: rimosse mail e numeri di cellulare (per sicurezza anche le password), fa attenzione a pubblicare dati pubblicamente specie se non sono tuoi.
Ultima modifica effettuata da lumo il 09/09/2017 alle 17:04
Comunque il codice funziona, scrivi i dati in formato binario.
Per leggere i dati dal file Utenti.txt dovrai avere un altro programma che fa:
Codice sorgente - presumibilmente C/C++
struct Admin f;
fread(&f, sizeof(f), 1, fp);
E a quel punto f sarà popolata con i valori. Ovviamente se apri Utenti.txt con l'editor normale vedrai scritte strane, perché ad esempio il numero IdUtenti verrà salvato così com'è ma l'editor lo interpreterà come carattere.
Inoltre se uno dei tuoi campi, ad esempio Nome[20], venisse riempito solo parzialmente ("Tommaso\0", 7 caratteri più terminatore), fwrite scriverà comunque la parte rimanente di caratteri non usati (e deve farlo), ma questi sono memoria non inizializzata e potrebbero avere qualsiasi valore.
Ad esempio quello che viene fuori a me è questo:
Se vuoi stampare sul file i valori in formato testuale devi usare fprintf, ma non vedo che senso avrebbe visto che parti già da un file di testo leggibile.
Ti do dei consigli sul codice:
1) impara a indentare bene, tutti i blocchi di codice devono essere allo stesso livello di spaziatura e quando apri un nuovo blocco ({.. }) devi aumentare la spaziatura di un numero fisso di caratteri.
2)fscanf e scanf leggono le stringhe secondo il formato C, cioè vengono memorizzati prima i caratteri e infine il carattere '\0' (codifica ascii 0) che indica la fine della stringa.
Quindi per il numero di telefono di 10 caratteri ti serve char Cellulare[11];
In generale tieni presente che il tuo programma non funzionerà bene se viene dati un nome di più di 20 caratteri, perché andrà a sovrascrivere i caratteri di Cognome.
Se vuoi saperne di più suoi problemi di sicurezza che si hanno quando si usa fread così, leggi su internet cos'è un buffer overflow.
Comunque visto che è un codice didattico va bene, l'importante è che tu lo sappia se mai un giorno lavorassi.
3) in fopen non ti serve l'opzione "+" penso.
Ultima modifica effettuata da lumo il 09/09/2017 alle 17:18
Grazie per la risposta, le password sono inventate quindi no problem ahah
comunque, a me risulta che il file sia vuoto, ha 0KB di memoria.. com'è possibile?
Come risolvo d'altronde il doppione dell'ultimo record?
Semplicemente, evita di leggere un rigo fuori dal while (se il file è vuoto ti accorgi che è bene non farlo),
leggi rigo x rigo finchè non trovi l'EOF con la fgets come hai fatto
e dentro il while utilizza sscanf con la variabile line (perchè la crei, se non la utilizzi??)
se non vuoi caratteri strani potresti azzerarti la struct ad inizio while, in questo modo nel .txt avresti un output tipo
(NUL)(NUL)(NUL)TOMMASO(NUL)(NUL)(NUL)(NUL)PERILLI(NUL)(NUL)(NUL) ecc..
(con notepad++ ad esempio)de gustibus.
Ultima modifica effettuata da Mikelius il 09/09/2017 alle 19:34