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:
Posta un commento