Newsgroup: it.comp.lang.c++
Titolo: stranezza nell'apertura successiva di due file

Sto cercando di unire le informazioni di 2 file in un unico,
ma mi sono appena accorto che il programma si comporta in maniera strana:
Praticamente il primo file viene letto correttamente mentre il secondo si
apre sulla 2^ riga!!??
in pratica:
ifstream file1(file_ingresso_1.c_str(), ios::out);
ifstream file2(file_ingresso_2.c_str(), ios::out);
do{
    file1>>dato1>>dato2;
    array[dato1]=dato2;
}while(!file2.eof());
do{
    file2>>dato1>>dato2;
    array[dato1] += dato2;      
}while(!file2.eof());
Mi da due problemi:
1)il primo e' che appunto del file2 non viene letta la prima linea ma si
prte direttamente dalle 2
2)il secondo (che di solito bypasso con un break;) e' che stranamente la
fine del file mi viene trovata con un passaggio di ritardo, in pratica
l'ultima linea del file mi viene letta 2 volte


Non hai messo la dichiarazione di 'array'. Non hai messo la 
dichiarazione di 'dato1' e 'dato2' (ancora piu' grave, dato che usi un 
operatore overloaded - operator>> - e quindi _occorre_ sapere il tipo). 
Non hai detto cosa intendi esattamente con "unire" ("concatenare"?).
Obiettivamente, quando posti, prova a chiederti: se io non sapessi 
nulla, capirei quello di cui sto parlando in questa mail? :-)
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

Mattia Belletti wrote:

Volevo cercare di essere il piu' semplice possibili e non fare il copia e
incolla del listato che chiaramente e' un po piu' complesso.
Comunque in effetti forse il problema risiede proprio li ecco quindi il
codice:
-----------------------------------------------------------------------
string file_ingresso_1;
file_name_aggiunta(filename_1,".dat",file_ingresso_1);
    ifstream statistica_1(file_ingresso_1.c_str(), ios::out);
string file_ingresso_2;
file_name_aggiunta(filename_2,".dat",file_ingresso_2);
    ifstream statistica_2(file_ingresso_2.c_str(), ios::out);
long double *array_istogrammi;
        long int Lunghezza_Loop;
        long double Numero_Loop;
        long int Lunghezza_Loop_precendete=0;
        try{
            array_istogrammi=new long double[LUNGHEZZA_MAX_VORTICI];
            for(long int i=0; i< LUNGHEZZA_MAX_VORTICI ; i++){
                array_istogrammi[i]=0;
            }
        }catch(bad_alloc pt_err){
            cout<< "errore nell'allocazione di uno degli array di
array_istogrammi\n";
            exit(1);
        }
        do{
            statistica_1>>Lunghezza_Loop>>Numero_Loop;
            if(Lunghezza_Loop==Lunghezza_Loop_precendete){break;}
            Lunghezza_Loop_precendete=Lunghezza_Loop;
            array_istogrammi[Lunghezza_Loop] =  Numero_Loop;
        }while(!statistica_1.eof());
        do{
            statistica_2>>Lunghezza_Loop>>Numero_Loop;
            if(Lunghezza_Loop==Lunghezza_Loop_precendete){break;}
            Lunghezza_Loop_precendete=Lunghezza_Loop;
            array_istogrammi[Lunghezza_Loop] +=  Numero_Loop;
        }while(!statistica_2.eof());
----------------------------------------------------------------------------

 codice:
Chiarisco il concetto: _spiega_ cosa vuoi fare. _poi_ metti tutto e solo 
il codice essenziale. All'inizio non hai fatto bene nessuna delle due, 
poi hai fatto solo la seconda (anche se c'era pure del non essenziale), 
mentre quello che piu' importa e' la prima :-).
Conviene a te: la gente e' piu' disposta a leggere una descrizione in 
linguaggio naturale di un problema per poi cercare l'errore nel codice, 
piuttosto che leggere del codice sbagliato, "intuire" il problema, e poi 
correggere il codice basandosi su un'intuizione.
Sarebbe utile fare un esempio di file di input e del corrispondente output.
