Leggere e gestire i dati letti da un file .txt

Ogni gioco/applicazione che si rispetti dovrà avere la possibilità di salvare e leggere dati da files presenti sul nostro hard disk.
Per fare questo ci sono diverse tecniche, classi "serializzate", lettura di file XML , lettura di file .txt..
Andiamo ora a vedere la tecnica più semplice, ovvero come poter leggere da file .txt dove abbiamo precedentemente scritto dei dati.
Per fare questo non sarà necessario l'uso di classi XNA. Infatti, già di per se la libreria System possiede tutte le capacità per leggere e scrivere dati su files.
Ci basterà dunque aggiungere questa direttiva tra gli "using" del nostro file .cs:

using System.IO;

Dove IO sta per "Input Output", entrata e uscita.
A questo punto potremo usare la classe File che ci permette di fare innumerevoli operazioni con i files.
Con questo codice per esempio, andremo a caricare il contenuto del file "percorso/file.txt" e lo andremo a salvare all'interno della variabile di tipo stringa, testoTotale.

string testoTotale = File.ReadAllText("percorso/file.txt");

A questo punto avremo una variabile che contiene tutto il testo presente nel file specificato.
Quando andremo a caricare un testo con questa tecnica, esso verrà caricato per intero, ovvero avremo un testo unico salvato su una variabile di tipo stringa.
Sarà dunque necessario dividere il testo in "elementi" cioè in parti, ovvero in diverse sottostringhe che potremo usare a nostro piacimento.
Per fare questo ci appoggeremo al metodo Split (dividi), della classe string. Splittare un testo significa dividere una stringa in tante altre stringhe. Per decidere come e dove dividere la stringa "madre" dovremo impostare un carattere che sia identificato come "divisore", cioè come quel carattere che se incontrato, determina la fine di una sottostringa e l'inizio di un'altra.

//Decidiamo il carattere che splitta
char[] carattereDivisore = { ';' };
//Splittiamo
string[] elemento = testoTotale.Split(carattereDivisore);

Con la prima riga di codice abbiamo indicato il punto e virgola come carattere divisore. In questo modo, ad ogni punto e virgola presente del testo, verrà effettuata la divisione del testo. Con la seconda istruzione avremo salvato ogni "sottostringa" trovata su un array (una lista) di stringhe chiamato elemento e potremo richiamare ogni elemento con il codice elemento[0], elemento[1], ecc.. dove il primo elemento trovato corrisponde al numero 0.

Mettiamo per esempio di avere un file .txt con questo testo al suo interno:

Prova;5;2.94;Ciao

Cioè un semplice testo fatto di parole e numeri divisi dal simbolo ;
In questo caso abbiamo quattro variabili da "estrapolare" dal file di testo ovvero:

la parola "Prova"
Il numero "5"
Il numero con virgola "2.94"
La parola " Ciao"

Lo faremo con questo codice:

       
//Leggi il file
string testoTotale = File.ReadAllText("percorso/file.txt");
//Decidiamo il carattere che splitta
char[] carattereDivisore = { ';' };
//Splittiamo il testoTotale
string[] elemento = testoTotale.Split(carattereDivisore);
//Salviamo ogni elemento in una stringa diversa
string primo_elemento = elemento[0];
string secondo_elemento = elemento[1];
string terzo_elemento = elemento[2];
string quarto_elemento = elemento[3];


.
Avremo caricato quattro elementi di tipo string, e sarà nostro compito convertirli nel tipo di dato che ci serve, eventualmente in numeri interi o altro, a seconda delle nostre esigenze.
Per esempio, essendo la seconda e la terza stringa dei numeri, li vorremo presumibilmente utilizzare come tali. Avremmo potuto fare la conversione direttamente sul codice precedente, cambiando la seconda e la terza riga di codice che inizializzano i quattro elementi, così:


    string
primo_elemento = elemento[0]; //essendo testo non c'è bisogno di conversione
    int
secondo_elemento = Convert.ToInt32(elemento[1]); //convertiamo il testo in tipo int
    float terzo_elemento = Convert.ToSingle(elemento[2]); //convertiamo il testo in tipo Single (float)
    string quarto_elemento = elemento[3]; //essendo testo non c'è bisogno di conversione



Ovvero convertiamo sin da subito gli elementi trovati.
Come avrete notato, per convertire un dato in float, non si usa il codice Convert.ToFloat (che non esiste), ma: Convert.ToSingle.