Domanda su QTextStream e eventualmente sui file in generale
-
Ciao, ho un file di stringhe scritte con write | text cioè ogni stringa viene inserita e aggiunta alla fine del file con QTextStream e sono soddisfatto.
Le righe sono a lunghezza variabile.bq. Pippo
Pluto
Paperino
Qui
Quo
Qua
Gastone
Ciccioper fare un esempio, QTextStream mi consente di leggere e aggiungere, ma che succede se volessi cambiare un nome che magari ho inserito in modo errato? Devo riscrivere il file ogni volta per intero? Esiste un metodo di QTextStream che mi consenta di modificare la singola stringa/riga?
Ciao e grazie
-
Puoi usare il metodo "seek":http://qt-project.org/doc/qt-4.8/qtextstream.html#seek per posizionarti nel punto in cui vuoi sovrascrivere e poi usare il mentodo "atEnd":http://qt-project.org/doc/qt-4.8/qtextstream.html#atEnd per ritornare alla fine altrimenti appendi i testi a partire dal punto in cui ti trovi traslando verso il basso i rimanenti.
a
b
c
d
e <==poi fai seek(2)
a
b
c <==
d
equindi se inserisci avrai:
a
b
c
new row<==
d
ese poi inserisci nuovamente avrai
a
b
c
new row
new row 2<==
d
ee cosi via
per andare alla fine usa atEnd
Considera che nel tuo caso stai inserendo stringhe variabili quindi per posizionarti dovresti leggere lo stream con seek e capire se sei a fine stringa intercettando il carattere "\n".
-
Scusa se ho capito bene:
@QFile file("pippo.txt");
// Apre il file in modalità scrittura e formato testo
if ( file.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream stream( &file );stream.seek(5); // nome = stream.readLine(); Posso farla? // Questa scrive sulla riga precedente? // e se la riga è lunga in modo diverso? // mettiamo che sovrascrivo qui quo o qua che succede? stream << "paperoga" << "\n"; file.close();
}@
Volendo potrei fare una readLine() per mettere il valore in qDebug() ? dopo la seek intendo. Cioè posso fare seek, readline e writeLine?
-
Guarda questo codice:
@#include <QFile>
#include <QTextStream>#include <QtDebug>
int main( int argc, char **argv )
{
QFile file( "main.cpp" );
if( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
qFatal( "Could not open the file" );QTextStream stream( &file );
while( !stream.atEnd() )
{
QString text;
stream >> text;
qDebug() << text;
}stream.seek( 0 );
while( !stream.atEnd() )
{
QString text;
text = stream.readLine();
qDebug() << text;
}file.close();
return 0;
}@Questo programma e' un piccolo esempio su come usare QTextStream e il caomdno seek.
Come vedi alla riga 21 io posiziono il cursore dello strem alla posizione 0 con il comando seek e questo mi permette di leggere il contenuto di tutto lo stream attraverso il ciclo while.
Nel tuo caso puoi costruire una funzione che dandogli in pasto lo strem, la nuova riga e la posizione voluta inserisce esattamente la nuova riga alla posizione indicata traslando il resto piu in basso.
Esempio
Tu hai lo stream
pippo
pluto
paperino
marcoadesso vuoi inserire la stringa ciccio alla seconda posizione
quindi chiamimyfucntion(stream, "ciccio", 2);
il risultato sara':
pippo
ciccio
pluto
paperino
marco -
Quindi se faccio:
@stream.seek(5)
stream << "marcello" << "\n"@
marco viene shiftato in sesta fila e marcello diventa la 5° linea
ma per cancellare o aggiornare cioè fare un'update?
ciao e grazie
P.S. forse la domanda appare stupida, ma la mia esperienza di database è ristretta all'as400 in cui per fare una modifica bastava veramente poco, c'era un database con viste logiche molto molto semplice da usare.