Newsgroup: it.comp.lang.c++
Titolo: Per favore aiutatemi Parte IIa

Ho corretto gli errori del listato precedente in modo che tutti non mi
facciano notare quelli... questo problemone mi affligge da ormai piů di una
settimana:
Se leggo il file dal main non ho alcun problema... se invece come ho fatto
qui creo una funzione che legge il file (Leggi), dopo che la richiamo per un
pň di volte comincio ad avere output strani ed errori di outofrange... come
dicevo prima sembra che le variabili si sporchino, si riempiano fuori dal
loro range, anche perchč ho avuto violazioni di accesso...
Il listato:
int main(int argc, char **argv)
{
    string Leggi(ifstream);
    string S;
    ifstream infile;
    infile.open("testo.txt");
    do {
        //    getline(infile,S); // In principio era cosě
        S=Leggi(infile);       // Ora č cosě e da problemi
        cout << S << endl;
        getch();
    } while     (S!="FINE");
            return 0;
}
std::string Leggi(ifstream file)
{    // La mitica funzione Leggi
    std::string s;
    getline(file, s);
    return s;
}

 loro range, anche perchè ho avuto violazioni di accesso...
Gli stream non si possono copiare, quindi andrebbero passati
per riferimento (o puntatore). Alcuni compilatori hanno gli
stream copiabili come estensione (probabilmente il tuo 
compilatore e' fra questi).
Come parametro conviene usare un istream invece di ifstream,
in modo che la funzione possa prendere anche altri tipi di
stream (es. usare std::cin se il programma viene chiamato
senza argomenti).
Se il fine non contiene usa riga con scritto solo "FINE"
(oppure il file non esiste), il loop non termina, e
continua a leggere anche dopo la fine del file.
Questa potrebbe essere la causa degli output strani, pero'
non si spiegherebbe perche' capitano solo quando si
usa la funzione Leggi. 
A parte questi problemi (e getch che non esiste), a me
il programma compila e funziona (egcs 1.0.3).
	Mauro

 per riferimento (o puntatore).
Azz! E' vero!...
EMG

il programma compila e funziona (egcs 1.0.3).
il programma che ho fatto č in VCL e non funzia, ho translato questa sezione
per studiarla uso il compilatore del c++Builder 3 che penso sia buono...
Dove ho messo getch()?
E' questo un problema cosě grosso che nessuno neanche di quelli con le cose
sotto riesce a risolvere? Ma non c'e' una soluzione alternativa magari piů
semplice?
Grazie mille a chi si č interessato comunque vada!!

 Ma non c'e' una soluzione alternativa magari più semplice?
Più semplice di così non credo proprio.
EMG

 Ma non c'e' una soluzione alternativa magari piů semplice?
Usare direttamente std::getline.
	Mauro

Cosi' compila correttamente con lo GNU g++, che e' uno dei piu' ANSI
compliant:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string *Leggi(ifstream *file)
{    // La mitica funzione Leggi
    string *s = new string;
    getline(*file, *s);
    return s;
}
int main(int argc, char **argv)
{
    string *S;
    ifstream infile("testo.txt");
    do {
        S=Leggi(&infile);
        cout << *S << endl;
        //getch(); tolto perche' non ricordo in che header file sta
    } while (*S!="FINE");
    return 0;
}
--
To answer take your filthy hands out of my address.

     } while (*S!="FINE");
Cosi' pero' la funzione Leggi alloca una std::string
che deve poi essere deallocata da qualche parte,
altrimenti ad ogni iterazione del ciclo disperdi
della memoria.
	Mauro

         S=Leggi(&infile);
Anche se funziona lo stesso, forse sarebbe più pulito
string *Leggi(ifstream &file)
...
        S=Leggi(infile);
EMG

        cout << *S << endl;


 in mezzo minuto!!!
A me la std::getline() risulta molto veloce. Sul mio vecchio Pentium 120
legge un file da quasi 400 Kb in mezzo secondo circa. Comunque è vero
che la std::fstream::getline() risulta parecchio più veloce.
Probabilmente perché non deve allocare memoria per la stringa ma si
trova l'array già fatto. Quindi pare proprio che per applicazioni che
richiedono velocità conviene ancora rivolgersi ai cari vecchi array di
caratteri.
EMG

che la std::fstream::getline() risulta parecchio più veloce.
Mah! Io ho un p133... la fstream_getline ci mette mezzo secondo... l'altra
mezzo minuto!
Qualche opzione di compilazione sballata....