Newsgroup: it.comp.lang.c++
Titolo: ESAMI IN VISTA

Ciao
volevo chiedervi come si fa a gestire gli input da file, in un esercizio c'è
una tabella
C#0012 tele=4
0 I 12:24:02   B PV74882
3 U 12:24:15   C AB-182-ZZ
2 U 12:24:18   D CF-298-SG
1 I 12:24:22   B MN577622
3 U 12:24:23   D CF-298-SG
bisogna fare un programma che sia in grado di estrarre da una singola riga
della tabella il numero di corsia  (prima colonna),
la prima riga non mi serve mi servono solo i primi 2 dati di ogni riga,
Come posso fare per dire al programma di saltare la prima riga???
come si fa pe far leggere il primi caratteri e poi passare alla riga
successiva????
grazie.

 writes:

Io userei awk o perl (probabilmente awk, che e' piu' semplice) - ma
questo e' un esercizio di esame (vedi soggetto)...  Quindi:
1) apri il file; in caso di errore, segnalalo e vai a 11).
2) leggi una linea dal file;
3) se hai un errore di lettura, segnalalo e vai a 9).
4) se hai finito, vai a 9).
5) se sono soddisfatti i criteri che ti impongono di trascurare questa
   linea (numero d'ordine, carattere iniziale, ...) vai a 2)
6) dividi la linea in campi secondo la loro definizione (colonna,
   blanks, whitespace, ...)
7) interpreta i vari campi e fai quello che devi fare
8) torna a 2)
9) chiudi il file; in caso di errore, segnalalo.
10) stampa un sommario di quello che ti e' richiesto.
11) esci.
Era tanto difficile?
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

Come posso fare per dire al programma di saltare la prima riga???
Adesso mi girano i c****ni porca vacca... E' un esame universitario e
non sai come fare questo programma IDIOTA?????
Scusate lo sfogo...
Luc.

successiva????
//
// chesudata.cpp
//
#include <iostream>
#include <string>
using namespace std ;
int main()
{
    char p[50] ;
    for ( int i = 0 ; cin.getline( p, 50 ) ; i++ )
    {
        if ( i > 0 )
        {
           cout << p[0] << ',' << p[2] << endl ;
        }
    }
    return 0 ;
}
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

non sai come fare questo programma IDIOTA?????
Non sapevo che avessi dei "coglini" ... ;))
ROTFL ;))


ROTFL ;))
Erano solo le 8:48, dai...
Luc.

Io te lo mando anche tutto: è l'esame dell'anno scorso!!!
Anzi ti faccio seguire anche un'altra versione su un post successivo.
Il problema che non devi chiedermi di spiegartelo perchè NON LO CAPISCO
APPIENO!!!
Ciao
Ugo MN
Segue svolgimento:
#include <string>
#include <iostream>
#include <fstream>
#include <strstream>
using namespace std;
// classe per la gestione delle eccezioni
class MyError {
    string msg;
public:
    MyError( string e) {
 msg = e;
    }
    string tell() const {
 return msg;
    }
};
// Nella classe Corsia si e' usato 'numCat' invece
// del numero 6 esplicitamente per comodita'!!
class Corsia {
public:
    static const int numCat = 6;
    Corsia();
    void addInfo( string data) throw( MyError);
    int tellPass() const;
    int tellPass( int cat) const throw( MyError);
    char tellDir() const {
 return dir;
    }
private:
    int  catPass[numCat];
    char dir;
};
Corsia::Corsia()
{
    int i;
    for( i=0; i<numCat; i++) {
 catPass[i] = 0;
    }
    dir = '*';
}
void Corsia::addInfo( string data) throw( MyError)
{
    istrstream stst( data.c_str());
    char pdir;
    string pora;
    char pccat;
    int rcat;
    if( !(stst >> pdir >> pora >> pccat)) {
 MyError bad("Corsia: dati non corretti!");
 throw bad;
    }
    // gestione tipo corsia (B=bidirezionale)
    if( dir=='*') {
 dir = pdir;
    } else if( pdir!=dir) {
 dir = 'B';
    }
    // gestione categoria passaggio
    rcat = pccat - 'A';
    if( rcat<0 || rcat>=numCat) {
 MyError bad("Numero categoria errato!");
 throw bad;
    }
    catPass[rcat]++;
}
int Corsia::tellPass( int cat) const throw( MyError)
{
    if( cat<0 || cat>=numCat) {
 MyError bad("Numero categoria errato!");
 throw bad;
    }
    return catPass[cat];
}
int Corsia::tellPass( ) const
{
    int i,sum;
    for( i=0, sum=0; i<numCat; i++) {
 sum += catPass[i];
    }
    return sum;
}
class Tele {
    int id;
    int lnNum;
    Corsia *lns;
    void setId( string info) throw( MyError);
    void setLnNum( string info) throw( MyError);
public:
    Tele( string def) throw( MyError);
    ~Tele();
    void newLine(string line) throw( MyError);
    void printLane( int pln) const throw( MyError);
    void print() const;
    int tellTotal() const;
    int tellId() const {
 return id;
    }
    int tellLnNum() const {
 return lnNum;
    }
};
void Tele::setId( string info) throw( MyError)
{
    if( info[0]!='C' || info[1]!='#') {
 MyError ini("Dati identificazione casello non riconosciuti!");
 throw ini;
    }
    istrstream stst( info.c_str() + 2);
    int newId;
    if( !(stst >>newId)) {
 MyError bad("Identificatore casello non leggibile!");
 throw bad;
    }
    id = newId;
}
void Tele::setLnNum( string info) throw( MyError) {
    char iden[] = "tele=";
    if( info.find(iden)==string::npos) {
 MyError ini("Dati corsie telepass non riconosciuti!");
 throw ini;
    }
    istrstream stst( info.c_str() + info.find(iden) + sizeof(iden) - 1);
    int newNum;
    if( !(stst >>newNum)) {
 MyError bad("Numero corsie telepass non leggibile!");
 throw bad;
    }
    lnNum = newNum;
}
Tele::Tele( string def) throw( MyError)
{
    lns = 0;
    setId( def);
    setLnNum( def);
    lns = new Corsia[lnNum];
}
Tele::~Tele( string def)
{
    delete[] lns;
}
void Tele::newLine(string line) throw( MyError)
{
    istrstream stst( line.c_str());
    string resto;
    int pln;
    // salta le linee vuote (specialmente l'ultima)
    if( line.size() == 0) {
 return;
    }
    if( !(stst >>pln)) {
 MyError bad("Numero corsia non leggibile!");
 throw bad;
    }
    if( pln<0 || pln>=lnNum) {
 MyError bad("Numero corsia errato!");
 throw bad;
    }
    getline( stst, resto);
    lns[pln].addInfo( resto);
}
int Tele::tellTotal() const
{
    int i;
    int sum;
    for( i=0, sum=0; i<lnNum; i++) {
 sum += lns[i].tellPass();
    }
    return sum;
}
void Tele::printLane( int pln) const throw( MyError)
{
    int i;
    if( pln<0 || pln>=lnNum) {
 MyError bad("Numero corsia errato!");
 throw bad;
    }
    cout << "Corsia " << pln << " (" << lns[pln].tellDir() << ") "
  << " Passaggi = " << lns[pln].tellPass() << endl;
    for( i=0; i<Corsia::numCat; i++) {
 string msg = "\t\t- cat ";
 msg += ('A' + i);
 msg += " = ";
 if( lns[pln].tellPass(i)) {
     cout << msg << lns[pln].tellPass(i) << endl;
 }
    }
}
void Tele::print() const
{
    int i;
    cout << "Casello " << tellId()
  << "\tCorsie = " << tellLnNum();
    cout << "\tTotale passaggi " << tellTotal() << "\n";
    for( i=0; i<lnNum; i++) {
 printLane(i);
    }
}
int main() try
{
    string fname;
    string riga;
    ifstream fIn;
    cout << "Nome file? ";
    cin >> fname;
    fIn.open( fname.c_str());
    if( !fIn.good()) {
 cerr << "File non trovato\n";
 return 1;
    }
    getline( fIn, riga);
    Tele tp( riga);
    while( getline( fIn, riga)) {
 tp.newLine( riga);
    }
    tp.print();
} catch( MyError e) {
    cerr << e.tell() << "\n";
}
-- 
Posted from 
smtp1.libero.it
 [193.70.192.51] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Come anticipato ecco la seconda versione.
Ciao
Ugo Mn
PS: Ci vediamo al 1° Marzo all'esame!!!
Second version:

using namespace std;




Corsia::Corsia()
{
    int i;






    return catPass[cat];
}


    return sum;
}


    string idStr = info.substr( 2); // dal terzo carattere sino alla fine
    istrstream stst( idStr.c_str());
    int newId;
    if( !(stst >>newId)) {
 MyError bad("Identificatore casello non leggibile!");
 throw bad;
    }
    id = newId;
}
void Tele::setLnNum( string info) throw( MyError) {
    string iden = "tele=";
    string numStr = info.substr( info.find(iden) + iden.size());
    if( numStr.size() == 0) {
 MyError ini("Dati corsie telepass non riconosciuti!");
 throw ini;
    }
    istrstream stst( numStr.c_str());

    lnNum = newNum;
}




















    tp.print();

-- 
Posted from 
smtp3.libero.it
 [193.70.192.53] 


PS: Ci vediamo al 1° Marzo all'esame!!!
EVVIVAAAAAAAAAA !!!
Hanno inventato la posta elettronica !!!...



Usa getline per leggere una intera riga:
   ifstream in(/*...*/);
   string linea;
   getline(in, linea);
A questo punto il 'piů' č fatto.
Saluti Manlio Perillo