sabato 1 agosto 2009

Utilizzo di Qt per i file

Siamo dunque giunti al primo di una serie di articoli che tratteranno le librerie Qt in maniera un po' più seria (e anche il primo articolo da dott. ihihih!!!).

Apriamo il nostro fidato Qt Creator e proviamo a interagire con un file, che potrebbe essere benissimo un file di configurazione o un file di sistema.

Per allenarci creeremo una funzione preso in input un file, una funzione per effettuare le modifiche a una stringa e una tabella hash (int,qstring) passata per puntatore, riempie la tabella con indice e stringa modificata dalla funzione.

Nel nostro caso la funzione di modifica della stringa sarà semplicemente prendere i primi x caratteri.
void parseString( void * str )
{
QString * objStr = (QString * ) str;

*objStr = (*objStr).left( CODE_LEN );
}

Quindi nella nostra funzione fillHashTable andiamo ad aprire e scorrere il file come segue:

1) Creiamo un oggetto di tipo QFile passandogli il path del file da aprire:
    QFile filePtr (file);


2) Creiamo uno stream di dati sul file in sola lettura e cicliamo fino a che non viene raggiunta la fine del file.
    QTextStream stream( &filePtr );
while( !stream.atEnd() )
{
line = stream.readLine();
}


Ora con la linea ottenuta possiamo fare quello che vogliamo. Nell'esempio cerchiamo i token separati dallo spazio e il primo token sarà il numero il secondo la stringa da formattare.

Ecco quindi l'intera funzione:
void fillHashTable( QString file , void(*parser) (void * str), QHash <int , QString> * tb )
{
QHash <int , QString> table;
QFile filePtr (file);
bool fin = false;

if( !filePtr.open(QIODevice::ReadOnly | QIODevice::Text) )
{
cout<<"ERRORE nell'apertura del file"<<endl;
exit( -2 );
}
table.clear();
QTextStream stream( &filePtr );
QString line, tok01 , tok02;
QStringList tokens;

while( !stream.atEnd() || !fin )
{
line = stream.readLine();
if( line == "" )
{
fin = true;
continue;
}

tokens = line.split( " " );
tok01 = tokens[0];
parseString( &tokens[1] );
tok02 = tokens[1];

table.insert( tok01.toInt() , tok02 );
}


filePtr.close();

*tb = table;
}


Si dovrà dunque scrivere un main che semplicemente stampa a console i valori inseriti nella tabella hash.
Importante: l'oggetto QHash appena creato ha già un elemento in posizione 0. Per questo va pulito con il metodo clear. In merito a questo, che per me è un difetto, sto cercando materiale ma per il momento non ho ancora trovato nulla.

Ecco infine il main creato per quest'esempio:
int main(int argc, char *argv[])
{
QHash <int , QString> table;
table.clear();
fillHashTable( "file.txt", parseString, &table );
cout<<"Stampa della hash di dimensione "<<table.size()<<endl;
for( int i = 0; i < table.size() ; i++ )
{
cout<<i<<" : "<<table[i].toStdString()<<endl;
}

return 0;
}


Per ora ho concluso. Buon divertimento con quest'esempio che può ovviamente essere adattato a molte situazioni.

Nessun commento: