File txt letto come matrice [r][c]

di il
37 risposte

37 Risposte - Pagina 2

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

    Buongiorno a tutti , purtroppo non ho molto tempo per seguire in modo continuativo il programma che sto cercando di realizzare ma quando trovo ritagli di tempo cerco di procedere........
    Ok per i punti 1 e 2 ci sono :

    Contatore riga
    int CountRows( char *filename ){
    fstream file;
    string s;
    int r=0;
    file.open("temperature.txt",ios::in);
    while(!file.eof())
    {getline(file,s,'\n');
    r++;}
    return (r);
    file.close();}

    il controllo lo faccio nel main controllando se rows=0 ---> file vuoto

    adesso procedo con il punto 3 ma in che modo devo passare la matrice letta a quella creata in modo dinamico che metodo devo utilizzare?:

    //apro file txt da leggere

    fstream file;
    file.open("temperature.txt",ios::in);

    //allocazione memoria dinamica della matrice

    matrix = new double*[rows];
    for ( i=0; i < rows;i++)
    {matrix = new double[column];}
    for ( i=0; i < rows; i++){
    for ( j=0; j < column; j++)
    matrix[j] = ----> in questa parte del codice devo mettere la matrice che leggo ma come ???
    }
  • Re: File txt letto come matrice [r][c]

    int CountRows( char *filename ){
    fstream file;
    string s;
    int r=0;
    file.open("temperature.txt",ios::in);
    while(!file.eof())
    {getline(file,s,'\n');
    r++;}
    return (r);
    file.close();}
    No. Primo perchè non usi il parametro filename (non hai letto il mio post) e secondo perchè non chiudi il file (lo fai dopo la return, quindi mai). Dovresti scrivere:
    int CountRows( char *filename ){
        fstream file;
        string s;
        int r=0;
        file.open(     filename      ,ios::in);
        while(!file.eof())
        {
          getline(file,s,'\n');
          r++;
        }
        file.close();
        return (r);
    }
    Dopo allocato la matrice devi passare al punto 4. (riaprire il file per caricare la matrice) ovvero devi fare una funzione simile alla CountRows() che in aggiunta riceverà come parametri la matrice, il numero di righe e il numero di colonne.
    Nel while(!file.eof()) di questa nuova funzione dovrai inserire la logica per saltare la prima riga e per ogni riga letta posizionarti sulla riga corretta (verificando di non andare oltre il limite delle righe allocate!).
  • Re: File txt letto come matrice [r][c]

    Non penso sia quello che intendi tu ma nelle mie prove ho implementato il main in questo modo :

    // ottengo numero righe e colonne
    rows=(CountRows("temperature.txt")-1);
    if (rows==0)
    {cout<<"file inesistente";}
    ......
    // apro file
    ifstream file("temperature.txt");
    .......
    //allocazione matrice e memorizzazione valori
    .....
    file>>matrix[j] ;

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

    Continui a ragionare mettendo tutto insieme; io sto cercando di farti vedere come un problema affrontato in sottoproblemi si risolve semplicemente.
    L'allocazione della matrice è una cosa mentre la lettura da file per il caricamento della matrice un'altra.
    L'allocazione la sai fare. Bene, vai oltre, non mischiarla con l'apertura del file.
    Ora ti suggerisco di scrivere una funzione (copiandola dalla CountRows()) per il caricamento dell'array che arriverà pertanto già allocato.
    Come prima cosa fai solo che legge riga per riga, caricando nella matrice semplicemente il numero di riga nella prima colonna. Quando questo funzionerà penseremo a trasformare ogni riga letta in un array di valori.
  • Re: File txt letto come matrice [r][c]

    Double allocazione_matrice(int rows, int column)
    {
    int i,j;
    double **matrix;
    matrix = new double*[rows];
    for ( i=0; i < rows;i++)
    {matrix = new double[column];}
    for ( i=0; i < rows; i++){
    for ( j=0; j < column; j++)
    matrix[j];
    return (matrix[j]);}
    }

    Cosi va bene ?? i parametri riga/colonna li prendo dal main oppure non metto parametri?

    // per caricare la matrice mi perdo leggerissimamente
    int Carica_Matrix( char *filename ){
    fstream file;
    string s;
    int r=0;
    file.open(filename,ios::in);
    while(!file.eof())
    {r=1;
    getline(file,s,'\n');

    // come prendo la matrice allocata per mettere la stringa s ....??
    }
    file.close();

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

    Punto3/4 non riesco a trovare come passare la matrice allocata ... alla funzione di apertura file e e carico valori ...
  • Re: File txt letto come matrice [r][c]

    Mi rendo conto che passare una matrice potrebbe rappresentare un problema (comunque su questo forum è già stato trattato l'argomento, basta cercare) pertanto lascia stare la funzione, fai il resto all'interno del main(): l'allocazione la sai fare mentre per il caricamento da file fai come ti avevo suggerito, inizia con leggere riga per riga (copi il codice che hai già scritto nella CountRows()) e per ora limitati a caricare la prima colonna della matrice mettendoci su ogni riga il numero di riga (devi inserire la logica di saltare la prima riga e di uscire dal ciclo se il file è alla fine o se abbiamo raggiunto il numero massimo di righe allocato).
  • Re: File txt letto come matrice [r][c]

    Ciao Candaluar,
    Nel Main ho implementato il programma con questa modalità :

    // chiamo la funzione rows per ottenere le righe( + o - lo stesso per le colonne)
    rows=(CountRows("temperature.txt")-1);

    //allocazione matrice
    matrix = new double*[rows];
    for ( i=0; i < rows;i++)
    {matrix = new double[column];}
    for ( i=0; i < rows; i++){
    for ( j=0; j < column; j++)
    file>>matrix[j] ;}
    if (matrix[0][j]==' ') --------->>>verifica che il file non sia vuoto
    cout<<"file senza valori"<<'\n';
    for ( i=0; i < rows; i++){
    for ( j=0; j < column; j++)
    cout << matrix[j]<<'\t';
    cout << endl;}
    cout << endl;

    //libero memoria matrice
    {for ( i=0; i < rows; i++)
    delete[] matrix;
    delete[] matrix;}}

    In questo modo il programma sembra funzionare ,ma, credo non sia quello che intendi tu.
    Da quello che hai scritto penso che dovrei utilizzare getline(file,s,'\n') per leggere riga per riga...... in qualche modo caricare :
    matrix[0] = s e successivamente dividere la stringa in "colonne"
    Sbaglio???
  • Re: File txt letto come matrice [r][c]

    Innanzitutto utilizza il tag code per postare codice, altrimenti si fa fatica a capire.
    Poi, va bene l'allocazione della matrice e la sua deallocazione alla fine; per caricarla però devi aprire il file e fare il ciclo riga per riga, finchè ci sono righe e alla fine chiudere il file: questo non lo hai fatto.
  • Re: File txt letto come matrice [r][c]

    Ciao , sono riuscito a concludere il programma con la stampa a video e la relativa chiusura del file.
    Avrei una domanda per il passaggio della matrice ad una funzione.
    Nelle varie prove effettuate sono riuscito a passare la matrice al main in questo modo :

    // creo la funzione allocazione matrice con i relativi parametri
    double allocare_memoria_matrice(char *filename ,int rows, int column)
    double **matrix;
    ....sviluppo del codice
    ......
    ......
    return (**matrix);

    impostando return (**matrix); riesco a passare la matrice ed il programma funziona, ma non ho una conoscenza del c++ tale per capire se il processo è giusto/sconsigliato/errato ?? il programma funziona ma volevo un vostro parere.
    Grazie
  • Re: File txt letto come matrice [r][c]

    Qualche indicazione per l'ultimo chiarimento? ( passaggio matrice con return? )

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

    No, assolutamente. Così passi un valore double dato che il tipo della funzione che hai usato

    double allocare_memoria_matrice

    è un double.

    Se devi restituire una matrice, restituisci il doppio puntatore matrix

    return(matrix);

    e la funzione sarà di tipo

    double **allocare_memoria_matrice

    Ovviamente la matrice dovrà essere allocata dinamicamente dentro la funzione e la memoria liberata dal chiamante.
  • Re: File txt letto come matrice [r][c]

    Ciao e grazie Oregon Intendevi in questo modo :

    double **allocare_memoria_matrice(char *filename ,int rows, int column)
    ...
    ..
    file>>matrix[j];}
    return (matrix);}



    Avrei anche un altra domanda :
    io vorrei gestire l'apertura del file di testo in una funzione apposita per evitare di ripetere nelle altre funzioni del programma le parti di codice interessate all'apertura e manipolazione dello stesso...
    In quale modo posso migliorare il programma e passare il file aperto come argomento alle altre funzioni senza dover ripetere le righe di codice nelle altre funzioni
    fstream file;
    file.open(filename,ios::in);
    Grazie
  • Re: File txt letto come matrice [r][c]

    ....qualche piccolo suggerimento ....
  • Re: File txt letto come matrice [r][c]

    Passa file per riferimento

    fstream& f
Devi accedere o registrarti per scrivere nel forum
37 risposte