Riportare un file.txt dall'inizio dentro un ciclo for

di il
8 risposte

Riportare un file.txt dall'inizio dentro un ciclo for

Ciao a tutti,
ho un problema con un file di testo e un ciclo for.
Praticamente dovrei leggere un file.txt. Da questo file, per ogni gruppo di 10 righe dovrei eseguire alcune operazioni. Il problema è che il mio gruppo di 10 righe dovrebbe essere scalato man mano dal file.txt di una riga per volta. Ad esempio: all'inizio prendo le prime 10 righe e faccio le mie operazioni (quindi ho dalla riga 1 alla 10); poi scalo alla riga 2 e considero altro gruppo di 10 righe (dalla 2 alla 11), e così via....

Ho impostato il mio codice, solo che non riesco a far coincidere l'incremento del ciclo for con la riga del file.txt. Ho provato con la funzone seekg(0, ios::beg), ma non saprei come gestirla all'interno del for.
Potreste gentilmente darmi un aiuto??
Grazie

#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <math.h>
#include <algorithm>
#include <vector>

using namespace std;

ifstream leggi ("file.txt");

int main()
{
if (!leggi) {cout<<"\n Impossibile aprire il file.txt "<<endl; return 1;}

double giuliano, RMS;
string data;
double indice, media;
double somma;
int entrate;
int ruler=10;
int a = 1;
int b = 100;

cout << "ruler = " << ruler << endl;

/*leggi.clear();
leggi.seekg(0, ios::beg); // serve per far ripartire il file.txt dall'inizio
for (int j = 1; j <= 0; j++)
{leggi >> giuliano>> RMS>> data;}*/


// inizio giorno 1


for (int j = a; j <= b; j++) // loop sulle righe del file.txt che mi interessano

{

cout << "j = " << j << endl;
somma=0;
media=0;
entrate=0;
int i=1;


while (i<=ruler)

{
leggi >> giuliano>> RMS>> data;

{cout<<"\n" << " "<<i<<" "<<fixed<<setprecision(3)<<RMS;
somma += RMS;}
i++;
}

entrate=i-1;
media=somma/entrate;
cout<<"\n somma = "<<somma<<" "<<" entrate = "<<entrate<<endl;
cout<<"\n entrate = "<<i-1<<endl;
cout<<"\n Media = "<<media<<endl;
}
cout<<endl<<endl;

// fine giorno 1

return 0;
}

8 Risposte

  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Ciao
    ma perchè non metti i dati che ti servono in un vettore?
    riempi inizialmente il vettore leggendo i dati dal file 10 record.
    esegui questo ciclo
    fai i tuoi bravi calcoli sul vettore
    immaggino che poi li devi visualizzare
    scali il vettore di 1 cioè copi la locazione n nella locazione n-1
    siccome l'ultima locazione è uguale alla penultima andarai a leggere 1 record dal file e lo metterai nell'ultima locazione.
    se l'operazione è riuscita, cioè il file non è finito, procederai con il ciclo altrimenti il programma è finito.
    questo è il metodo più veloce.
    la parte del ciclo te ho messa in rosso.
    spero di esserti stato di aiuto
  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Grazie per il suggerimento. Vedrò di risolvere il mio problema...
  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Ciao, scusa ma ho un problema sul secondo ciclo. Ho salvato i miei dati sul vettore myvector. Faccio un ciclo dal primo all’ultimo elemento, però non capisco come impostare il secondo ciclo per prendere gruppi di 10 elementi per volta e scalando man mano di un elemento il myvector
    
    for(int k=0; k<myvector.size(); k++) //ciclo sugli elemti del vettore
        {  
            for (int j = k; j <10; ++j) //ciclo su ogni 10 elementi
                  {
                      cout<<myvector[j]<<endl;
                  }
         }
    
  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Mi sembra che il tuo ciclo sia corretto. Facciamo un esempio per capirci, hai il seguente vettore :

    1 2 3 4 1 0 2 3 4 5 9 7 3 0 3 1 1 6 0 4

    vuoi prendere i 10 elementi partendo da 1 fino al 5, facendo le operazioni che devi nel ciclo più interno, poi passi al secondo elemento parti da 2 e arrivi al 9 e così via.

    Se è questo che desideri, dovresti semplicemente correggere la condizione di uscita del for più interno j=10+k e aggiungere la condizione di uscita se il vettore non ha più 10 elementi rimanenti.
  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Si, esatto. E' proprio quello che volevo ottenere. Correggendo la condizione j=k+10 fuonziona. Solo che non capisco come dovrei aggiungere la seconda condizione di uscita, cioè se il vettore non ha più 10 elementi rimanenti. Vedo che il ciclo continua prendendo tutti valori 0 dopo l'ultimo elemento (ad es, dopo 4 prende tutti 0)
    Dovrei inserire un if?
    Saresti così gentile da spiegarmelo un po' meglio. Grazie
  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Così immagino dovrebbe funzionare, non sarà forse un modo elegante ma credo funzioni. Metto la condizione if(myvector[k+10]==0) perchè nel caso del mio vettore non ho mai elementi uguale a 0. Accetto volentieri opinioni da voi esperti. Grazie
    
     for(int k=0; k<myvector.size(); k++)
                      
                      {
                                
                       
                                for (int j = k;  j <k+10;  j++)
                              
                                cout<<"  "<<myvector[j]<<endl;
                                cout<<endl<<endl;
                               if(myvector[k+10]==0) break;
                      }  
    
  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Puoi più semplicemente scrivere:
    
    for(int k=0; k<myvector.size(); k++) //ciclo sugli elemti del vettore
        { 
            for (int j = k; j <k+10 && j<myvector.size(); ++j) //ciclo su ogni 10 elementi
                  {
                      cout<<myvector[j]<<endl;
                  }
         }
    
  • Re: Riportare un file.txt dall'inizio dentro un ciclo for

    Grazie per il vostro aiuto.
Devi accedere o registrarti per scrivere nel forum
8 risposte