Newsgroup: it.comp.lang.c++
Titolo: leggere numeri da file...

per esercizio, e anche per fare un esperimento, sto cercando di scrivere un
programma che legga numeri di estrazioni del lotto da file di dati.
dato che tutte le estrazioni sono nel seguente formato
| ##-##-##-##-## |
ha senso leggere un carattere per volta, metterlo in una stringa facendola
scorrere in modo che faccia da fifo, e confrontarla di volta in volta con
una maschera fatta cosě
|___-__-__-__-___|
e solo quando corrisponde leggere i numeri? o ci sono metodi piů efficienti?
altra domanda...
per mettere in memoria i numeri, sta bene usare un array  multidimensionale
extr[105][10][5]
dove 105 č il numero di estrazioni nell'anno in esame, 10 le ruote e 5 i
numeri per ruota?
fiducioso, attendo consigli
Raffaele

 i numeri per ruota?
sta sicuramente bene, anche se e' preferibile mettere gli indici piu' 
grandi in fondo.
Ma e' piu' leggibile, IMHO
enum Ruota {Bari = 0, Cagliari, Firenze, Genova, Milano, 
            Napoli, Palermo, Roma, Torino, Venezia};
struct Estrazione {
    int num[5];
    Ruota ruota;
};
ancora meglio poi con una classe Anno che gestisca le 10 ruote, del tipo
class Anno {
  std::vector <Estrazione> anno_(1050)
  ...
public:
  ...
  Anno(const std::string& file_dati) {
    //carica dati nel vettore
  }
  const Estrazione& operator()(const Ruota& r, const int& num) const {
     return anno_[(num-1)*10+(int)r]; }
  ...
};
cosi' basta una cosa del tipo
Anno anno1999("1999.dat");
Estrazione e = anno1999(Cagliari, 55);

 anche solo per scorrerli, devi leggere da file almeno la stringa. quindi
[CUT]
mi segno tutto, e appena ci capisco un pò di più provo ad usare anche le
classi...
per ora ho prodotto questo codice funzionante...
legge i numeri con il metodo che ho descritto nel primo post, li stampa
tutti a video, e poi stampa una "griglia" per volta le estrazioni. ho usato
c++ builder 3 facendo un'applicazione da console...
#pragma hdrstop
#include <conio.h>
#include <fstream.h>
#include <iomanip.h>
#include <string.h>
bool match(char* fifo);
void printtab();
int tab[105][10][5];
int i, gg = 0, rr = 0, nn = 0;
//--------------------------------------------------------------------------
-
#pragma argsused
int main(int argc, char **argv)
{
    char* extr;
    char c;
    char fifo[] = "                  ";
    int i;
    fstream extrs;
    extrs.open("extr2001.txt", ios::in);
    while(!extrs.eof())
    {
        extrs.get(c);
        for(i = 1; i<=17; i++)
            fifo[i-1] = fifo[i];
        fifo[17] = c;
        match(fifo);
    }
getch();
printtab();
getch();
}
bool match(char* fifo)
{
    bool ok;
    char num[2];
    char mask[] = "| ##-##-##-##-## |";
    if(mask[0]==fifo[0] && mask[18] == fifo[18] && fifo[1] == ' ' &&
isdigit(fifo[2]))
    {
        ok = true;
        for(i=1;i<6;i++)
        {
            num[0] = fifo[(i*3)-1];
            num[1] = fifo[(i*3)];
            cout<<atoi(num)<<" ";
            tab[gg][rr][nn] = atoi(num);
            nn++;
        }
        if(nn == 5 && rr!=11)
        {
            nn=0;
            rr++;
        }
        if(rr==10 && nn==5)
        {
            rr=0;
            gg++;
            nn=0;
        }
    }
    return ok;
}
void printtab()
{
    int gg, rr, nn;
    clrscr();
    for(gg=0;gg<105;gg++)
    {
        for(rr=0;rr<10;rr++)
        {
            for(nn=0;nn<5;nn++)
            {
                cout<<setw(2)<<tab[gg][rr][nn]<<" ";
            }
            cout<<"\n";
        }
        cout<<"\n\n";
        getch();
        clrscr();
    }
}
queste solo le prime righe del file dati, così se qualcuno vuole provare....
DA QUI
____________________________________________________________________________
____________________________________________________________________________
__________________
Numero e        |      BARI      |    CAGLIARI    |    FIRENZE     |
GENOVA     |     MILANO     |     NAPOLI     |    PALERMO     |      ROMA
|     TORINO     |    VENEZIA     |
Data Estrazione |                |                |                |
|                |                |                |                |
|                |
105 - 31/12/2001 | 51-40-65-72-57 | 59-76-25-22-08 | 54-79-61-27-26 |
09-55-69-41-35 | 63-84-36-53-20 | 66-17-55-45-50 | 69-28-15-11-51 |
41-17-64-75-15 | 54-66-24-82-33 | 35-33-14-44-20 |
104 - 29/12/2001 | 24-03-60-70-26 | 15-33-38-19-51 | 83-80-56-41-46 |
51-22-26-30-37 | 68-74-77-54-26 | 53-18-82-61-14 | 26-13-34-70-14 |
49-68-47-81-82 | 40-33-30-84-46 | 29-10-09-74-40 |
103 - 27/12/2001 | 26-10-09-43-07 | 18-06-70-47-31 | 80-38-20-50-19 |
88-43-11-70-38 | 53-31-35-06-84 | 90-47-81-21-77 | 21-65-38-39-55 |
20-51-34-71-43 | 52-37-03-62-85 | 04-49-35-61-40 |
ogni numero di estrazione va su una riga a se stante.
si accettano commenti, dato che il programma funziona, ma di sicuro non è
strutturato nel migliore dei modi....
ciao!
Raffaele


c'e' anche una parziale traduzione in italiano 
http://www.umbertosorbo.it/modules.php?name=List