Leggere file txt a blocchi con loop

di il
13 risposte

Leggere file txt a blocchi con loop

Ciao a tutti,
sono al primo post, vi spiego il mio problema banale. Sto leggendo da file txt alcune righe e poi estraggo solo una parte del contentuto di queste righe. Il mio file è organizzato a blocchi, cioè ogni blocco è formato da un numero di righe uguale e a me interessa estrarre sempre le stesse righe di ogni blocco. Quindi dovrei riuscire a creare un loop che legga ogni blocco di 7 righe, fino alla fine del file, ed estrarre solo le righe 1 e 4. Di queste poi dovrei estrarre solo alcuni dati. Come vedete ogni blocco si conclude con una serie di 0 e da lì ne incomincia un altro. Vorrei evitare di usare arraylist o altre strutture, ma semplicemente leggere e scrivere subito su file i dati estratti.

Questo è solo un esempio del file d'input "in.txt" che uso:

introduzione: (Roba ora)
che io
ho
fine: (scritto tante cose)
nel
file
0000

introduzione: (Roba ora)
che io
ho
fine: (scritto tante cose)
nel
file
0000

introduzione: (Roba ora)
che io
ho
fine: (scritto tante cose)
nel
file
0000
.............
.............

Questo è il codice che ho iniziato a scrivere:

#include<iostream>
#include<fstream>
#include <sstream>
using namespace std;

int main()
{

string buffer;

ofstream out;
ifstream in;

out.open("out.txt");
in.open("in.txt");

int countline(1);

while(getline(in,buffer))

{

// Quello che mi serve è entrare con un loop per ogni blocco in questa parte di codice ed
//effettuare queste operazioni

if (countline == 1 ) {
buffer.erase (0,15);
buffer.erase (8,1);
out<<buffer;
} else if (countline == 4) {
buffer.erase (0,7);
buffer.erase (18,1);
out<<buffer<<endl;
}
countline++;
}


}
out.close();
in.close();
}

Sapete darmi una mano? Vi riperto che vorrei evitare di usare arraylist o altre strutture, ma semplicemente leggere e scrivere subito su file i dati estratti.
Grazie in anticipo

13 Risposte

  • Re: Leggere file txt a blocchi con loop

    
    while(getline(in,buffer))
    {
        countline %= 7;
        if(countline == 0 || countline == 3)
             out << buffer << endl;
        else
             buffer.clear();
    
         countline++;
    }
    
    non basta una cosa così?
  • Re: Leggere file txt a blocchi con loop

    Sì ovviamente hai ragione. Solo che per lavoro tutto il giorno vedo solo Cobol e di questi linguaggi ad alto livello ho perso un pò la mano. Comunque grazie mille per la risposta tempestiva. Un'altra modifica che vorrei effettuare al mio programm è quella di aprire contemporaneamente più file txt in input ad esempio in1,in2,in3 etc, sempre organizzati allo stesso modo dell'esempio, e lasiare aperto il file output per salvare tutto nello stesso file di output out. Ho provato in questo modo ma non funziona, mi legge solo il file in1.

    int main()
    {

    string buffer;

    ofstream out;
    ifstream in1, in2;


    out.open("out-ciclo.txt");
    in1.open("1-9 - Nodo 1.txt");
    in2.open("1-9 - Nodo 2.txt");

    int countline(1);

    while(getline(in1,buffer))


    {

    countline %= 34;
    if (countline == 2) {
    buffer.erase (0,20);
    buffer.erase (8,12);
    buffer.erase (19,68);
    out<<buffer;
    } else if (countline == 5) {
    buffer.erase (1,37);
    buffer.replace (2,1,",");
    out<<buffer;
    } else if (countline == 20) {
    buffer.erase (2,42);
    buffer.erase (16,1);
    out<<buffer;
    } else if (countline == 21) {
    buffer.erase (2,45);
    buffer.erase (16,1);
    out<<buffer;
    } else if (countline == 24) {
    buffer.erase (1,19);
    out<<buffer<<endl;
    }
    else
    buffer.clear();

    countline++;


    }

    in1.close();

    while(getline(in2,buffer))


    {

    countline %= 34;
    if (countline == 2) {
    buffer.erase (0,20);
    buffer.erase (8,12);
    buffer.erase (19,68);
    out<<buffer;
    } else if (countline == 5) {
    buffer.erase (1,37);
    buffer.replace (2,1,",");
    out<<buffer;
    } else if (countline == 20) {
    buffer.erase (2,42);
    buffer.erase (16,1);
    out<<buffer;
    } else if (countline == 21) {
    buffer.erase (2,45);
    buffer.erase (16,1);
    out<<buffer;
    } else if (countline == 24) {
    buffer.erase (1,19);
    out<<buffer<<endl;
    }
    else
    buffer.clear();

    countline++;


    }

    in2.close();
    out.close();
    }
  • Re: Leggere file txt a blocchi con loop

    Dopo la chiusura del in1 azzerra anche il countLine e buffer. cmq il codice da te proposto è corretto eccetto l'azzerramento.
  • Re: Leggere file txt a blocchi con loop

    Ho effettuato questo ma credo che non sia corretto.

    while(getline(in1,buffer))

    {
    ........
    ........
    }

    in1.close();
    countline==0;
    //non credo sia corretto questo
    strcpy (buffer, "");

    while(getline(in2,buffer))

    { ......
    ........
    }

    in2.close();
    out.close();
    }
  • Re: Leggere file txt a blocchi con loop

    
    countline=0;
    buffer.clear();
    
  • Re: Leggere file txt a blocchi con loop

    Ho effettuato la tua modifica ma mi legge sempre solo in1 e scrive l'out senza tener conto anche di in2.


    while(getline(in1,buffer))

    {
    ........
    ........
    }

    in1.close();
    countline=0;
    buffer.clear();

    while(getline(in2,buffer))

    { ......
    ........
    }

    in2.close();
    out.close();
    }
  • Re: Leggere file txt a blocchi con loop

    Metti in allegato i due file e posta il tuo codice così riesco a fare il debug. Così stiamo parlando x aria.
  • Re: Leggere file txt a blocchi con loop

    Questo è il mio codice, per i file input sono in .txt e non riesco ad allegarli, possibile?? Ho provato a fare anche una cartella .zip ma niente.
    Grazie
    
    #include<iostream>
    #include<fstream>
    #include <sstream>
    using namespace std;
    
    
    
    int main()
    {     
    
    string buffer;
    
    ofstream out;
    ifstream in1, in2;
    
    out.open("out-ciclo.txt");
    in1.open("1-9 - Nodo 1.txt");
    in2.open("1-9 - Nodo 2.txt");
    
    int countline(1);
    
    while(getline(in1,buffer))
    {           
                
                countline %= 34;
                if (countline == 2) {
                buffer.erase (0,20);
                buffer.erase (8,12);
                buffer.erase (19,68);
                out<<buffer;
                } else if (countline == 5) {
                buffer.erase (1,37);
                buffer.replace (2,1,",");
                out<<buffer;
    		    } else if (countline == 20) {
                buffer.erase (2,42);
                buffer.erase (16,1);
                out<<buffer;
    		    } else if (countline == 21) {
                buffer.erase (2,45);
                buffer.erase (16,1);
                out<<buffer;
    		    } else if (countline == 24) {
                buffer.erase (1,19);
                out<<buffer<<endl;
    		    }
                else
                buffer.clear();
    
         countline++;
       
                
    }
    
    in1.close();
    countline=0;
    buffer.clear();
    
    while(getline(in2,buffer))
    {           
                
                countline %= 34;
                if (countline == 2) {
                buffer.erase (0,20);
                buffer.erase (8,12);
                buffer.erase (19,68);
                out<<buffer;
                } else if (countline == 5) {
                buffer.erase (1,37);
                buffer.replace (2,1,",");
                out<<buffer;
    		    } else if (countline == 20) {
                buffer.erase (2,42);
                buffer.erase (16,1);
                out<<buffer;
    		    } else if (countline == 21) {
                buffer.erase (2,45);
                buffer.erase (16,1);
                out<<buffer;
    		    } else if (countline == 24) {
                buffer.erase (1,19);
                out<<buffer<<endl;
    		    }
                else
                buffer.clear();
    
         countline++;
               
    }
    
    in2.close();
    out.close();
    }
    
  • Re: Leggere file txt a blocchi con loop

    Per i file input prova a vedere su questi link:

    http://didattica.polito.it/pls/portal30/sviluppo.disco_virt.download?p_id=134449&p_utente=S151970

    http://didattica.polito.it/pls/portal30/sviluppo.disco_virt.download?p_id=134450&p_utente=S151970

    Grazie ancora per la disponibilità
  • Re: Leggere file txt a blocchi con loop

    Non ho l'accesso al tuo disco virtuale anche se ero un vecchio studente del poli di Corso Duca . Ti mando un PM con una mail dove spedire il tutto.
  • Re: Leggere file txt a blocchi con loop

    Hai un messaggio privato.
  • Re: Leggere file txt a blocchi con loop

    Grazie del messaggio privato, ti ho risposto in maniera dettagliata.
  • Re: Leggere file txt a blocchi con loop

    Hai un nuovo messaggio privato.
    Grazie
Devi accedere o registrarti per scrivere nel forum
13 risposte