File txt letto come matrice [r][c]

di il
37 risposte

File txt letto come matrice [r][c]

Buongiorno a tutti,
sono alle prime armi con c++ e riscontro questo problema che blocca lo sviluppo del programma che vorrei creare:
vorrei leggere un file di testo avente righe variabili, contente valori double ,come se fosse una matrice [r][c] e successivamente effettuarvi dei calcoli , gestire la stampa a video o in un file.
La prima soluzione è funzionante ma impone dei limiti dimensionali. La seconda è la soluzione che vorrei utilizzare ma non conosco un modo per passare i limiti del file di testo.

1-// legge dati matrice statica
float mat[50][3]
ifstream dati("temperature.txt");
int r = 0;
while(!dati.eof())
{ dati >> mat[r][0]>> mat[r][1] >> mat[r][2];
r++;}

2-//gestione della matrice dinamica non ho limiti di dimensione ma come posso passare i valori delle righe al programma
cin >> nrow >> ncol;
matrix = new double*[nrow];
for ( i=0; i < nrow; i++){
matrix = new double[ncol];
}
for ( i=0; i < nrow; i++){
for ( j=0; j < ncol; j++)
matrix[j] = [matrice con dati letti da file temperature]
}

Come posso leggere il file di testo ed importare i valori nella matrice dinamica ? Grazie

37 Risposte

  • Re: File txt letto come matrice [r][c]

    Ti consiglio di fare un esempio di file che devi importare.
    Ad ogni modo, solitamente per risolvere questo tipo di casi si segue (almeno io faccio così) questo schema:
    1-apro il file e determino la dimensione (quindi nel tuo caso determini il numero di righe e il numero di colonne)
    2-verifico coerenza della dimensione (prima di allocare)
    3-alloco
    4-riapro il file (o se l'ho lasciato aperto mi riposiziono all'inizio) e carico l'array/buffer/matrice
    5-chiudo il file
  • Re: File txt letto come matrice [r][c]

    che blocca lo sviluppo del programma
    Non è vero che blocca lo sviluppo, se hai problemi con il caricamento da file potresti comunque caricare "da codice" i valori e sviluppare le fasi successive di analisi/calcolo/salvataggio su file.
  • Re: File txt letto come matrice [r][c]

    Ciao , file di esempio ( considera che le righe sono molte di più ) e solo per avere un idea.

    A T°C B T°C
    220.3 220.2
    220.1 221.3
    222.5 223.8
    .....
    ......


    //leggo il file
    ifstream dati("temperature.txt");
    int r = 0;
    while(!dati.eof())
    { float[r][2]
    dati >> mat[r][0]>> mat[r][1] >> mat[r][2];
    r++;
    }

    // la variabile r mi restituisce il numero di righe , mi riposiziono all'inizio del file( con un altro ciclo?) .
    come posso passare i valori letti all'esterno del ciclo per allocare la matrice dinamica?
  • Re: File txt letto come matrice [r][c]

    Se vuoi affrontare il primo punto non hai bisogno di una matrice, ma solo di un contatore per le righe e uno per le colonne.
    Semplifica ancora, inizia con la sola determinazione del numero di righe (ti suggerisco il metodo getline()).
  • Re: File txt letto come matrice [r][c]

    #include <iostream>
    #include <fstream>

    using namespace std;


    int main(){
    fstream file;
    string s;
    file.open("temperature.txt",ios::in); /
    int c=0;
    int r=0
    while(!file.eof()){
    getline(file,s,'\t');
    c++;}

    //come faccio per riportare la lettura del file all'inizio???? Per ottenere le righe ....??( o le colonne )


    while(!file.eof()){
    getline(file,s,'\n');
    r++;
    }

    cout << contacolonne-1<< endl;
    cout << contariga-1<< endl;

    }
  • Re: File txt letto come matrice [r][c]

    Se ho capito bene le colonne sono sempre 2, vero?
    Ora aggiungi la chiusura del file e metti tutto in una funzione
    int CountRows( char *filename );
    che ti ritorna r, richiama la funzione dal main() e stampa a video il risultato.
    (nota: r-1 lascialo fare al main(), supponi di non sapere nella CountRows() che la prima riga di intestazione va scartata...)
  • Re: File txt letto come matrice [r][c]

    Si le colonne sono note ma vorrei capire anche come è possibile riportare il ciclo all'inizio del file per trovare le colonne ed avere una gestione + dinamica se possibile....
  • Re: File txt letto come matrice [r][c]

    Ti sto dicendo di chiudere il file. Chiudilo.
    Poi allocherai la matrice (da main()) e poi, con una funzione simile a quella che ti ho fatto fare, andrai a caricare la matrice. Cerca di ragionare a macro-problemi.
  • Re: File txt letto come matrice [r][c]

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

    int r=0;

    int CountRows( char *filename ){
    fstream file;
    string s;
    file.open("temperature.txt",ios::in);


    while(!file.eof()){
    getline(file,s,'\n');
    r++;}
    file.close();
    }

    int main()
    {
    CountRows("temperature");
    cout<<r;
    }


    Ok per le righe ci siamo.....
  • Re: File txt letto come matrice [r][c]

    Ora vai avanti con i passi successivi
    2-verifico coerenza della dimensione (prima di allocare)
    3-alloco
    4-riapro il file (o se l'ho lasciato aperto mi riposiziono all'inizio) e carico l'array/buffer/matrice
    5-chiudo il file
    per il punto 2 fai una verifica che ci siano almeno 2 righe (intestazione + 1 riga); il punto 3 lo sai fare; i punti 4 e 5 devi scrivere una funzione simile alla CountRows() ma a cui passerai anche la matrice allocata e il numero di righe che hai allocato
  • Re: File txt letto come matrice [r][c]

    If ( s.empty());
    cout<< " file vuoto"<<endl;

    nel ciclo while mi stampa file vuoto nonostante le righe presentano valori numerici ??? devo effettuare una conversione di dati per gestire s.empty() ?
  • Re: File txt letto come matrice [r][c]

    if ( s.empty());
    cout<< " file vuoto"<<endl;

    nel ciclo while mi stampa file vuoto nonostante le righe presentano valori numerici ??? devo effettuare una conversione di dati per gestire s.empty() ?
    Quale punto stai affrontando? Hai allocato la matrice (punto 2 e 3)?
  • Re: File txt letto come matrice [r][c]

    Sono al punto 2 :

    se la 1 riga è vuota allora ___> cout<<file non esiste
  • Re: File txt letto come matrice [r][c]

    Allora innanzitutto r devi metterlo locale a CountRows() e glielo fai ritornare.
    Poi usa il parametro filename... non ti sei chiesto a cosa serva questo parametro?
    Poi nel main scrivi
    int rows;
    rows = CountRows("temperature.txt");
    cout<<rows;
    I test di coerenza del punto 2 li fai testando rows e nient'altro!
Devi accedere o registrarti per scrivere nel forum
37 risposte