[C++] Lettura da file

di il
3 risposte

[C++] Lettura da file

Ciao a tutti, per prima cosa mi presento dicendo che è un pò che leggo questo forum che spesso e volentieri mi è stato di aiuto, quindi colgo l'occasione per ringraziarvi!
Detto ciò vengo al dunque...
Ho un dubbio per quanto riguarda la lettura dei dati da file.
L'esercizio che devo svolgere mi richiede di leggere dal file input.txt le coordinate (per ogni punto, prima ascissa, quindi ordinata) dei 3 vertici di un triangolo e successivamente calcolare e stampare sul file output.txt il perimetro del triangolo.
Parto copiando il programma che ho fatto e che pare funzioni:
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

int main() {
    int x1, x2, x3, y1, y2, y3;
    float latoAB;
    float latoBC;
    float latoCA;
    float perimetroTriangolo;
    
    ifstream flussodafile ("input.txt");
    cout << "leggi le coordinate dei tre vertici" << endl;
    flussodafile >> x1;
    flussodafile >> x2;
    flussodafile >> x3;
    flussodafile >> y1;
    flussodafile >> y2;
    flussodafile >> y3;
    cout << x1 << endl;
    cout << x2 << endl;
    cout << x3 << endl;
    cout << y1 << endl;
    cout << y2 << endl;
    cout << y3 << endl;
    flussodafile.close();
    
    latoAB = sqrt ( (float) ( ( x2 - x1 ) * ( x2 - x1 ) ) + ( ( y2 - y1 ) * ( y2 - y1 ) ) );
    cout << "il lato AB misura:" << " " << latoAB << endl;
    latoBC = sqrt ( (float) ( ( x3 - x2 ) * ( x3 - x2 ) ) + ( ( y3 - y2 ) * ( y3 - y2 ) ) );
    cout << "il lato BC misura:" << " " << latoBC << endl;
    latoCA = sqrt ( (float) ( ( x1 - x3 ) * ( x1 - x3 ) ) + ( ( y1 - y3 ) * ( y1 - y3 ) ) );
    cout << "il lato CA misura:" << " " << latoCA << endl;
    perimetroTriangolo = latoAB + latoBC + latoCA ;
    cout << "il perimetro del triangolo ABC misura:" << " " << perimetroTriangolo << endl;
    ofstream flussosufile ("output.txt");
    flussosufile << perimetroTriangolo;
    flussosufile.close();
    system("pause");
}

flussodafile >> x1;
flussodafile >> x2;
flussodafile >> x3;
flussodafile >> y1;
flussodafile >> y2;
flussodafile >> y3;
cout << x1 << endl;
cout << x2 << endl;
cout << x3 << endl;
cout << y1 << endl;
cout << y2 << endl;
cout << y3 << endl;


non mi convince la parte evidenziata...
Mi spiego meglio: io sapevo di aver bisogno di 6 coordinate (3 ascisse e 3 ordinate) e quindi di dover leggere 6 numeri dal file, per fare questo ho "richiamato" manualmente, una ad una le coordinate scrivendo flussodafile >> x1; flussodafile >> x2; ... flussodafile >> y3.
Questo procedimento, ammesso che sia corretto (a funzionare funziona, ma non vorrei fosse un caso) diventerebbe estremamente lungo nel caso io volessi o dovessi leggere da file 100 o più numeri o caratteri.
La mia domanda è: esiste un metodo per dire al programma di leggere i primi 6 numeri (in questo caso) o le prime 345 lettere o i primi 33 caratteri che incontra, senza doverli richiamare come ho fatto io?
Se si, mi potreste spiegare come? (magari con un esempio pratico )
Possono essermi utili gli array?
Grazie mille dell'attenzione, spero di aver indovinato la sezione giusta, in caso contrario chiedo venia!

3 Risposte

  • Re: [C++] Lettura da file

    Gli array sarebbero una buona scelta, eventualmente potresti usare una struct Point che ha membri X e Y ad esempio:
    
    typedef struct{
        int X;
        int Y;
    }Point;
    
    e creare un array di tipo Point. per la lettura da file poi:
    
    Point coordinate[n]
    for(int i=0;i<n;i++){
        file>>coordinate[i].X;
        file>>coordinate[i].Y;
    }
    
    Ovviamente è meglio fare anche un controllo di fine file.
  • Re: [C++] Lettura da file

    Lo ammetto.. sono un pò imbarazzato a chiederlo..
    dato che mi sono messo a studiare il c++ da poco, non sono un grande esperto..
    mi potresti spiegare la logica della struttra Struct Point? fino ad ora non l'avevo mai vista, così come non avevo mai visto un array di tipo point...
  • Re: [C++] Lettura da file

    Non avere imbarazzo, il forum serve a questo
    Beh, dato che studi il c++ da poco, posso dirti che la Struct viene usata per raggruppare in un unico oggetto più elementi eterogenei, cioè di tipo diverso. In pratica esso è come se fosse un record contenente alcuni campi, cioè gli oggetti raggruppati. Nel caso in esame:
    
    typedef struct{
        int X;
        int Y;
    }Point;
    
    si sta definendo un nuovo tipo (attraverso la typedef) di variabile di nome Point contenente due elementi, X e Y rispettivamente. Quindi per dichiarare una nuova variabile di tipo 'strutturato' appunto, si procede come nel caso normale per i tipi atomici (int,float,long,bool,ecc.):
    
    int i;  //dichiaro una variabile di tipo intero;
    Point p;  //dichiaro una variabile di tipo strutturato Point, definito in precedenza;
    
    Esso è utile proprio quando bisogna avere una variabile con diversi attributi. Un esempio:
    
    typedef struct{
        char nome[10];
        char cognome[10;
        int matricola;
    }Studente;
    
    In questo caso si definisce un tipo 'strutturato' Studente contenente alcune informazioni, cognome nome e matricola. Si può poi ad esempio creare un array di studenti:
    
    Studente elenco[10] //array di 10 studenti
    //per accedere agli elementi di un tipo strutturato, si ussa la dicitura con punto [variabile].[attributo]
    //esempio
    cout<<elenco[2].matricola; //visualizzo a video la matricola del terzo studente nell'array (dato che il primo elemento ha indice 0
    
    Se hai dubbi, scrivi pure sul forum.
Devi accedere o registrarti per scrivere nel forum
3 risposte