Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++] ofstream distrutto all'uscita della funzione

    Salve a tutti, mi sto cimentando con il C++ e sto facendo alcuni esercizi. Mi trovo a realizzare un piccolo esempio: costruire un vector di ostream e, attraverso una funzione mandare una stringa in tutti gli ostream del vettore. Ho quindi una funzione che costruisce questo vector di (puntatori a) ostream e lo inizializza inserendovi &cout e un &file. Se ciclo il vettore all'interno della funzione, i messaggi vengono correttamente riportati in tutti gli ostream, ma uscito dalla funzione e tornato al chiamante, l'output su cout viene correttamente riportato, ma l'output sull'ofstream su file invece genera un errore a me ancora abbastanza incomprensibile. Come se, all'uscita della funzione, quel puntatore a ostream presente nel vettore non fosse piú valido.
    Segue il codice sorgente compilabile e con stesso errore sia su compilatore ms (VS2019) sia su gcc. Potete dirmi per favore cosa c'é di concettualmente sbagliato?
    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    vector<ostream*> createStreams(const string& fileName) {
        vector<ostream*> result;
        result.push_back(&cout);
        ofstream lFile(fileName, ofstream::app);
        result.push_back(&lFile);
        for (ostream* ostr : result) {
            *ostr << "TEST in createStream function" << endl;
        }
        return result;
    }
    
    int main() {
        try {
            vector<ostream*> ostreams = createStreams("C:\\Users\\Armando\\Desktop\\testlog.txt");
            for (ostream* ostr : ostreams) {
                *ostr << "TEST in main function" << endl;
            }
        } catch (exception& e) {
            cerr << "Catched exception in main method: " << e.what() << endl;
        }
    }

    Ultima modifica di VegetaSSJ5; 21-12-2019 a 14:33

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,359
    Codice corretto ...

    codice:
    vector<ostream*> *createStreams(const string& fileName) {
        vector<ostream*> *result = new vector<ostream*>;
        result->push_back(&cout);
        ofstream *lFile = new ofstream(fileName, ofstream::app);
        result->push_back(lFile);
        for (ostream* ostr : *result) {
            *ostr << "TEST in createStream function" << endl;
        }
        return result;
    }
    
    
    int main() {
        try {
            vector<ostream*> *ostreams = createStreams("C:\\Users\\Armando\\Desktop\\testlog.txt");
            for (ostream* ostr : *ostreams) {
                *ostr << "TEST in main function" << endl;
            }
    
            // Distruzione oggetto ostreams ... attenzione agli oggetti allocati all'interno ....
        }
        catch (exception& e) {
            cerr << "Catched exception in main method: " << e.what() << endl;
        }
    
        return 0;
    }
    Ultima modifica di oregon; 21-12-2019 a 18:33
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Grazie mille oregon!
    Alla fine, cercando modalitá alternative di fare la stessa cosa, sono arrivato anch'io alla soluzione che tu hai proposto, dimenticando perķ la deallocazione degli oggetti puntati (). Chiedo venia per le "sciocchezze" che si possono scrivere quando si comincia a muovere i primi passi in un ambiente nuovo.

    Buone feste!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.