Evitare di contare l'end of line nella lettura di un file

di il
6 risposte

Evitare di contare l'end of line nella lettura di un file

Salve, sto scrivendo un programma che legge degli interi da un file di testo, copia solo i valori di posizione pari  in una struttura dati e li stampa.

Per fare questo, ho creato le funzioni LeggiFile e StampaVideo.

Il problema sorge, in particolare, nel while della prima funzione; infatti non riesco a trovare un modo affinché il loop si arresti una volta arrivato all'ultimo numero inserito del file, e non vada oltre contando anche l'end of line (almeno credo sia questa la ragione)…

Infatti mi succede che se inserisco un numero dispari di valori nel file, vengano stampati a video TUTTI i numeri in posizione pari + uno 0, mai inserito da me inizialmente (credo corrispondente, appunto, all'end of line)…oltre poi ad essere errato il NUMERO di valori presenti nel vettore, j, che risulta maggiorato di 1…

mentre  se inserisco un numero pari di valori nel file, vengono stampati a video TUTTI i numeri in posizione pari ed il numero di valori del vettore è corretto .E in questo caso va tutto bene…

Qualcuno potrebbe aiutarmi a capire come fare per arrestare il while senza che vada oltre l'ultimo numero inserito del file? in modo che il valore di j, il numero di valori della struttura, sia effettivamente corretto in tutti i casi?

come posso fare?

Grazie mille in anticipo e scusate, sto studiando da poco questi argomenti…

#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;

fstream Myfile;
int i=1;
int j=0;
int l[100];
int b[100];

string risposta;

void LeggiFile(int* a)
{
  //equivalente di ofstream
//scrittura dati
Myfile.open("Salvatore.txt", ios::out);
if (Myfile.is_open())
{
   Myfile<<"1  2  1  4  5  6  1  2  3  12  3  -12  12  10  11"<<endl;
Myfile.close();
}
//equivalente di ifstream
//lettura dati
//copia i valori nelle posizioni pari nella struttura dati b[100]
Myfile.open("Salvatore.txt", ios::in);
if (Myfile.is_open())
{
   
while (!Myfile.eof () && i<100)
{
  
 Myfile>>l[i];
 
 if((i)%2==0)
 {
     b[j]=l[i];
     j++;
     
 }
 
   i++;
 
 
}
  
}
Myfile.close();
}

void StampaVideo(int*a)
{
   
   cout<<"Dammi il nome del file da leggere completo di estensione:"<<endl;
   cin>>risposta;
   cout<<"Il numero di valori presenti nel vettore e': "<<j<<endl;
   cout<<"Ecco i valori del vettore:"<<endl;
   
   for(i=0;i<j;i++)
   {
       
       cout<<b[i]<<" "<<endl;
       
   }
   
}
int main()
{
   int* p;
   LeggiFile(p);
   StampaVideo(p);
}

6 Risposte

  • Re: Evitare di contare l'end of line nella lettura di un file

    Hai provato a non inserire endl nel file? 

  • Re: Evitare di contare l'end of line nella lettura di un file

    Io ti propongo questa modifica:

    void LeggiFile(int *a)
    {
       // equivalente di ofstream
       // scrittura dati
       Myfile.open("Salvatore.txt", ios::out);
       if (Myfile.is_open())
       {
          Myfile << "1  2  1  4  5  6  1  2  3  12  3  -12  12  10  11" << endl;
          Myfile.close();
       }
       // equivalente di ifstream
       // lettura dati
       // copia i valori nelle posizioni pari nella struttura dati b[100]
       Myfile.open("Salvatore.txt", ios::in);
       if (Myfile.is_open())
       {
          string s;
          while (!Myfile.eof() && i < 100)
          {
             Myfile >> s;
             if (s.length() > 0)
             {
                l[i] = stoi(s,nullptr,10);
    
                if ((i) % 2 == 0)
                {
                   b[j] = l[i];
                   j++;
                }
    
                i++;
             }
          }
       }
       Myfile.close();
    }

    In pratica leggo i numeri come stringa, poi testo se la stringa non è vuota, quindi converto in intero, salvo e incremento. Se sono all'eof, la stringa sarà vuota.

  • Re: Evitare di contare l'end of line nella lettura di un file

    Non stai “confrontando” l'eof, semplicemente l'eof viene rilevato solo dopo la lattura.

    Quindi ti basta modificare il ciclo così

           Myfile >> l[i];
           while (!Myfile.eof() && i < 100)
           {
               if ((i) % 2 == 0)
               {
                   b[j] = l[i];
                   j++;
               }
               i++;
               Myfile >> l[i];
           }
    
  • Re: Evitare di contare l'end of line nella lettura di un file

    12/07/2023 - Alexv ha scritto:


    Hai provato a non inserire endl nel file? 

    Non ho idea del perché non ci abbia minimamente pensato ieri notte, grazie mille!!! Funziona tutto alla perfezione :)))

    Buonissima giornata!

  • Re: Evitare di contare l'end of line nella lettura di un file

    13/07/2023 - Andrea Quaglia ha scritto:


    Io ti propongo questa modifica:

    void LeggiFile(int *a)
    {
       // equivalente di ofstream
       // scrittura dati
       Myfile.open("Salvatore.txt", ios::out);
       if (Myfile.is_open())
       {
          Myfile << "1  2  1  4  5  6  1  2  3  12  3  -12  12  10  11" << endl;
          Myfile.close();
       }
       // equivalente di ifstream
       // lettura dati
       // copia i valori nelle posizioni pari nella struttura dati b[100]
       Myfile.open("Salvatore.txt", ios::in);
       if (Myfile.is_open())
       {
          string s;
          while (!Myfile.eof() && i < 100)
          {
             Myfile >> s;
             if (s.length() > 0)
             {
                l[i] = stoi(s,nullptr,10);
    
                if ((i) % 2 == 0)
                {
                   b[j] = l[i];
                   j++;
                }
    
                i++;
             }
          }
       }
       Myfile.close();
    }

    In pratica leggo i numeri come stringa, poi testo se la stringa non è vuota, quindi converto in intero, salvo e incremento. Se sono all'eof, la stringa sarà vuota.

    Grazie mille per l'idea alternativa!!! 

    Non conoscevo la funzione che hai usato, sicuramente la userò in futuro, molto utile!! 

    Grazieeee

  • Re: Evitare di contare l'end of line nella lettura di un file

    13/07/2023 - oregon ha scritto:


    Non stai “confrontando” l'eof, semplicemente l'eof viene rilevato solo dopo la lattura.

    Quindi ti basta modificare il ciclo così

           Myfile >> l[i];
           while (!Myfile.eof() && i < 100)
           {
               if ((i) % 2 == 0)
               {
                   b[j] = l[i];
                   j++;
               }
               i++;
               Myfile >> l[i];
           }
    

    Grazie mille per il chiarimento!!! Ora ho capito il problema…

    Grazie ancora e buonissima giornata! :))

Devi accedere o registrarti per scrivere nel forum
6 risposte