Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    15

    Lettura per riga di un file di testo in C++

    Salve. Ho un problema in C++ e spero che mi potete aiutare.
    Devo accedere a un file .txt e devo leggere due interi m e k, due dimensioni di due insiemi A e B di dati. Successivamente nella seconda riga del file ho m numeri e nella seconda riga ho k numeri. Come faccio a leggere tutta la seconda riga e capire quando sono a fine riga? Stessa procedura dovrò fare poi per l'insieme B senza immischiare i dati di A e B.
    Esempio di file:

    3 4

    1 6 8

    3 4 7 9

    dove m=3 e k=4 e inoltre 1 6 e 8 sono gli elementi dell'insieme A e 3 4 7 e 9 sono gli elementi dell'insieme B.

    Grazie per la risposta!!

  2. #2

    Re: Lettura per riga di un file di testo in C++

    Come faccio a leggere tutta la seconda riga e capire quando sono a fine riga?
    Bhe potresti fare un check su '\n' (newline)...


  3. #3
    A cosa ti serve sapere che sei alla fine della linea? Usa normalmente l'operatore >> per estrarre i primi due interi, quindi, sempre con lo stesso operatore, ripetendo l'estrazione in base ai dati appena acquisiti, acquisisci i due insiemi di numeri.
    codice:
    #include <iostream>
    #include <fstream>
    #include <new>
    using namespace std;
    int main()
    {
        int m, k;
        int *a, *b;
        ifstream is;
        is.open("test.txt");
        if(is.fail())
        {
            cerr<<"Impossibile aprire il file.";
            return 1;
        }
        is>>m>>k;
        if(is.fail())
        {
            cerr<<"Errore durante la lettura del file.";
            return 2;
        }
        a = new int[m];
        b = new int[k];
        for(int c=0; c<m; c++)
        {
            is>>a[c];
            if(is.fail())
            {
                cerr<<"Errore durante la lettura del file.";
                return 3;
            }
        }
        for(int c=0; c<k; c++)
        {
            is>>b[c];
            if(is.fail())
            {
                cerr<<"Errore durante la lettura del file.";
                return 4;
            }
        }
        is.close();
        cout<<"m: "<<m<<" k: "<<k<<"\nA:";
        for(int c=0; c<m; c++)
            cout<<" "<<a[c];
        cout<<"\nB:";
        for(int c=0; c<k; c++)
            cout<<" "<<b[c];
        delete [] a;
        delete [] b;
        cin.ignore();
        return 0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Molto bello e semplice il metodo mostrato da MItaly, come sempre in C++ esistono molte strade per risolvere lo stesso problema, un altro metodo può essere quello che si avvale dell'utilizzo di strtok:

    codice:
    ifstream ifs("C:\\Test.txt"); // Apro lo stream del file 
    
    char line[100]; // definisco un Buffer per contenere i caratteri di una linea 
    
      while(ifs) // finché giungo alla fine del file, 
      {
        ifs.getline(line, 100); // prendo una linea per volta e... 
        {
           (void)strtok(line, " ");   // divido le parole (simboli) di questa linea che sono setarati da uno spazio vuoto
           strtok(NULL, " ");  // Ad esempio questo è il primo simbolo che ho trovato
           atoi(strtok(NULL, " "));  // Questo invece è il simbolo sucessivo convertito in numero intero ...
        }
      }  
       ifs.close();
    Ovviamente:

    codice:
    #include <string>
    #include <fstream>
    #include <iostream>
    Tuttavia l'utilizzo di strtok non ha molto senso se nel file sono contenuti solo numeri interi, se cioé non è necessario distinguerli da altri simboli alfanumerici

    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    15
    Grazie per la risposta, anche se ho provato il programma (il primo) e, se l'insieme A contiene più elementi di m, l'elemento che non appartiene ad A passa all'insieme B. Esiste un modo per evitare ciò?!!!!

    Esempio: se il mio file contiene

    m=3 k=4

    A: 2 3 5 1

    B: 3 4 5

    nell'esecuzione del programma succede che 1 passa come elemento di B, per questo a me serviva la fine della riga.

    Grazie ancora!!!

  6. #6
    E scusa, allora m e k a cosa servono? È chiaro che un programma per poter operare correttamente deve avere in input un file corretto...
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    15
    Va bene, allora l'utente crea solo file corretti, anche se in generale un utente qualsiasi può sbagliare a scrivere i dati e quindi sarebbe opportuno fare dei controlli!!

  8. #8
    Bhe sono stati dati abbondanti suggerimenti nonchè tracce di programmi molto ben scritti, a questo punto per gli ulteriori controlli potresti buttare giù un po di codice, poi magari ne discutiamo assieme....

  9. #9
    Originariamente inviato da carol84
    Va bene, allora l'utente crea solo file corretti, anche se in generale un utente qualsiasi può sbagliare a scrivere i dati e quindi sarebbe opportuno fare dei controlli!!
    Be', allora devi acquisire una linea alla volta (con ifstream::getline()) e "smontarti" le stringhe con un sstream, con la sscanf o in altri modi (ad esempio con la strtok, come nel programma di Paulin), rinunciando alla comodità dell'"estrattore" automatico >>.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.