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
    Ciccio

    per 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
    e

    quindi se inserisci avrai:

    a
    b
    c
    new row<==
    d
    e

    se poi inserisci nuovamente avrai

    a
    b
    c
    new row
    new row 2<==
    d
    e

    e 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
    marco

    adesso vuoi inserire la stringa ciccio alla seconda posizione
    quindi chiami

    myfucntion(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.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.