Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Domanda su QTextStream e eventualmente sui file in generale
Forum Updated to NodeBB v4.3 + New Features

Domanda su QTextStream e eventualmente sui file in generale

Scheduled Pinned Locked Moved Italian
5 Posts 2 Posters 3.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    E Offline
    etognoni
    wrote on last edited by
    #1

    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

    1 Reply Last reply
    0
    • N Offline
      N Offline
      nologinma
      wrote on last edited by
      #2

      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".

      1 Reply Last reply
      0
      • E Offline
        E Offline
        etognoni
        wrote on last edited by
        #3

        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?

        1 Reply Last reply
        0
        • N Offline
          N Offline
          nologinma
          wrote on last edited by
          #4

          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

          1 Reply Last reply
          0
          • E Offline
            E Offline
            etognoni
            wrote on last edited by
            #5

            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.

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved