Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    C++ lettura/scrittura da file di testo

    Ciao a tutti, sono nuovo su questo forum. Inizio col farvi i complimenti per l'ottimo lavoro svolto!!
    Veniamo al mio problema... Da un pò mi sono avvicinato al linguaggio C++ e inevitabilmente sto incontrando le prime difficoltà. In particolre sto lavorando su un programma che, preso in input un certo file .txt, lo legga e a partire da una certa riga inizia a salvare i dati su un array. Si tratta di file con una descrizione seguita da un elenco di punti con le varie coordinate. Io vorrei creare un array con 3 dimensioni contenete il numero (intero) del punto e le relative coordinate (float) e salvarlo in un file con lo stesso nome di quello di partenza ed estensione .out., che poi dovrò passare come input ad un altro programma.
    Inoltre il numero dei punti non è costante in ogni file, ma la dimensione è variabile ed è comunque riportata nella descrizione preliminare.

    Adesso... Ho dato un'occhiata in giro ma ci sta un casino di roba al riguardo, soluzioni diverse che non hanno fatto altro che aumentare i miei dubbi.

    Avete da propormi delle linee guida da seguire? Quale può essere un valido approccio al problema? E cosa dovrei rivedermi dal punto di vista teorico?

    Vi ringrazio anticipatamente

    Andrea

  2. #2

    Re: C++ lettura/scrittura da file di testo

    Originariamente inviato da andrea_p

    Avete da propormi delle linee guida da seguire? Quale può essere un valido approccio al problema? E cosa dovrei rivedermi dal punto di vista teorico?

    Vi ringrazio anticipatamente

    Andrea
    Benvenuto nel forum di Html.it

    Il concetto di 'linea guida' deriva principalmente dal mondo medico e l'utilità risiede nel dare al professionista (nella fattispecie il medico) una certa indicazione riguardo ad un quesito diagnostico-terapeutico. L'IT è una disciplina che discende, deriva e completa la Matematica, quindi una vera e propria scienza: con questa introduzione voglio farti capire quindi che esistono degli algoritmi e soluzioni ben precise alla stragrande maggioranza dei problemi; soluzioni diverse ma con risultati apparentemente simili in realtà sottendono prestazioni e/o margini di sicurezza eterogenee.

    Il mio consiglio è dividere il problema in più 'moduli', postando il codice in modo tale che possiamo segnalarti e consigliarti circa gli eventuali errori. Innanzitutto: sai aprire un file? Sai leggerlo? Conosci l'utilizzo delle matrici?

    Non so se stai studiando da qualche libro, nel frattempo un buonissimo sito per il C++ è C plus plus

    Ti invito inoltre a leggere il Regolamento, oltre a fare una ricerca nel forum in quanto argomenti già trattati in precedenza.
    Ovviamente per qualsiasi problema puoi scrivere direttamente e ti sarà data una risposta. Buon esercizio con il C++.

    Ciao

  3. #3

    Re: Re: C++ lettura/scrittura da file di testo

    Originariamente inviato da MdE2005
    Benvenuto nel forum di Html.it

    Il mio consiglio è dividere il problema in più 'moduli', postando il codice in modo tale che possiamo segnalarti e consigliarti circa gli eventuali errori. Innanzitutto: sai aprire un file? Sai leggerlo? Conosci l'utilizzo delle matrici?

    Non so se stai studiando da qualche libro, nel frattempo un buonissimo sito per il C++ è C plus plus

    Ciao
    Si un minimo di conoscenza ce l'ho, ho sostenuto un esame universitario in java qualche anno fa e da una settimana a questa parte ho utilizzato come punto di riferimento la guida a c++ presente su questo sito. Pertanto posso rispondere affermativamente alle tue domande.

    Diciamo che ho iniziato a "scrivere" il mio programma basandomi su qualcosa trovata qua e là su internet cercando di adattarla al mio caso.

    Oltre al main sto provando a creare i 2 metodi ReadData e WriteData.
    Inizio col riportare il metodo ReadData che dovebbe leggere i dati dal file:

    codice:
    void ReadData (string FileIn) {
        cout << "Nome File: " ;          // per immettere il nome
        cin >> FileIn;                     // del file da aprire
        cout << endl;                   // direttamente da tastiera
    
    
        ifstream in(FileIn.c_str());
        if (!in) {
            cerr << "impossibile aprire il file " << FileIn << endl;
            exit(1);
        }
        string token;
        while (in >> token) {
            if (token != "COORDINATE")
                continue;
            else cout << "inizio a leggere i dati" << endl;
    
    
        }
    }
    A questo punto, dopo il messaggio, il programma dovrebbe iniziare a leggere i dati..... Qui non so proprio come continuare!
    Fino ad ora cosa puoi dirmi?

  4. #4
    Aggiungo:
    ho fatto un piccolo passo avanti, sono riuscito a leggere tutto il file .txt, dopodiche' ho provato a selezionare solo le parti che mi interessano.
    Quindi quando incontro la stringa DIMENSION: mi estrae il relativo valore che poi ho anche convertito in intero in quanto mi servira' piu' avanti.
    Successivamente (sbagliando) ho creato un ciclo for in modo da poter leggere le righe relative ai vari punti, fino all'ultimo che corrisponde alla dimensione del problema. Dopodiche' incontra la stringa "EOF" e dovrebbe terminare il lavoro.
    Il problema adesso e' che non riesco ad uscire dal ciclo! Mi stampa continuamente il valore "EOF" : dove sbaglio?

    ecco il codice
    codice:
    #include <iostream>
    #include <fstream>
    #include <sstream>  // per convertire string in int
    #include <string>
    #include <climits>
    #include <cstdlib>
    using namespace std;
    
    void ReadData (string FileIn) {
        cout << "Nome File: " ;          // per immettere il nome
        cin >> FileIn;                   // del file da aprire
        cout << endl;                   // direttamente da tastiera
    
    
        ifstream in(FileIn.c_str());
        if (!in) {
            cerr << "impossibile aprire il file " << FileIn << endl;
            exit(1);
        }
        string token;
        cout << "***   INIZIO LETTURA   ***\n" << endl;
        while (in >> token) {
            int dim;
            if(token == "DIMENSION:") {
                getline(in, token);
                cout << "dimensione del problema: " << token << endl;
                istringstream sin;       // codice per
                sin.str(token);          // convertire la
                sin >> dim;              // stringa in int
                cout << "dimensione convertita in numero: " << dim << endl;
            }
    
            for(int i=0; i<dim; i++)    {
                    getline(in, token);
                    cout << token << endl;
                    continue;
            }
    
            if(token == "EOF" ) {
               break;
            }
        }
        cout << "\n***   FINE LETTURA   ***" << endl;
        in.close(); // chiude il file, e' necessaria??
        cout << "****   CLOSE   ****";
    }
    
    int main() {
        string FileIn;
        ReadData (FileIn);
        return 0;
    }
    inoltre vorrei capire bene il significato della funzione getline() : mi aspettavo che restituisse anche la prima stringa che legge ma invece non lo fa.
    Esempio: se legge la stringa reltiva al nodo 1 fatta cosi'
    1 4 5
    mi restituisce solo le coordinate, cioe'
    4 5

    perche'?

  5. #5
    Con la speranza che qualcuno mi risponda...
    Ho praticamente terminato il codice, c'e' solo un'imperfezione: come ultimo valore, anziche' leggere la coordinata y corrispondente all'ultimo nodo, mi restituisce automaticamente uno 0.
    Qualcuno riesce a capire a cosa e' dovuto?

    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    #include <cstdlib>
    #include <cctype>  // gestione dei caratteri isalnum()
    
    using namespace std;
    
    int node_num; // number of nodes
    
    float *cord_x = NULL;
    float *cord_y = NULL;
    
    void ReadMatrix( string FileIn )
    {
      // open file
      ifstream in( FileIn.c_str() );
    
      if( !in )
      {
        cerr << "Could not open file: " << FileIn << endl;
        exit( 1 );
      }
    
      // read the number of nodes
      string line;
      stringstream ss;
      string token;
    
      while( getline(in, line) ) {
        ss << line;
      }
    
      while( ss >> token ) {
        if( token.find("DIMENSION") != string::npos  ) {
          ss >> node_num;
          cout << "node num:" << node_num << endl;
        }
    
        if( token.find("NODE_COORD_SECTION") != string::npos  ){
          break;
        }
    
      }
    
      cord_x = (float*) malloc ( node_num * sizeof(float) );
      cord_y = (float*) malloc ( node_num * sizeof(float) );
    
      int index;
      float x, y;
    
      // read the coordinates
      for( int i =0; i<node_num; i++ ) {
          ss >> index >> x >> y;
          cord_x[index-1] =  x;
          cord_y[index-1] =  y;
    
        //  cout << index << "  "  << x << "  " << y << endl;
    
       /* in questo punto, se stampo l'operazione appena fatta, mi 
       *  restituisce correttamente tutti i nodi con le relative coordinate.
       *  Per quanto riguarda l'ultimo nodo invece, il valore relativo a
       *  cord_x e' corretto, mentre il valore relativo a cord_y (ultimo 
       *  valore prima di EOF) e' inspiegabilmente 0.
       */
      }
    
      in.close();
    }
    
    void WriteMatrix( string FileOut)
    {
      ofstream out( FileOut.c_str() );
    
      if( !out )
      {
        cerr << "Could not open file: " << FileOut << endl;
        exit( 1 );
      }
    
      //out << "NODE \tCORD_x \t CORD_Y\t\n";
    
      for(int i=0; i<node_num; i++)
      {
        out << (i+1) << " \t" << cord_x[i] << " \t" << cord_y[i] << endl;
      }
    
      out.close();
    }
    
    int main( int argc, char *argv[])    {
        string FileIn, FileOut;
        cout << "File name: " ;          // per immettere il nome
        cin >> FileIn;                   // del file da aprire
        cout << endl;                   // direttamente da tastiera
    
        /*if ( argc < 2 ) {
            FileIn  = "TESTIN";
            FileOut = "TESTOUT";
        }
        else if ( argc < 3 ) {
        */
    
            FileOut = FileIn;
            FileOut.erase( FileOut.size() - 4, FileOut.size() );
            FileOut += ".OUT";
       // }
    
        ReadMatrix(FileIn);
        WriteMatrix(FileOut);
    
        free(cord_x);
        free(cord_y);
    
        // delete(cord_x);
        // delete(cord_y);
    }

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.