Dubbio su ofstream

di il
12 risposte

Dubbio su ofstream

Salve a tutti

ho un dubbio 

se apro un ofstream ma non uso l'operatore di scrittura il file file viene creato lo stesso oppure viene creato solo quando incontra il primo operatore di scrittura?

questo dubio è sorto a causa di un errore di compilazione

if (dove==2) { ofstream lavoro("report mcd.txt", ios::out); }
....
....
....
if (dove == 2) { lavoro << reppy; } qui si genera l'erroe Errore (attivo) E0020	identificatore "lavoro" non definito
 

adesso la soluzione di questo errore, se ne conoscete altre sono gradite, sarebbe quella di levare la condizione alla creazione del file.

nel caso in cui il file venga creato all'apertura dello stream come potrei fare a condizionare questa cosa senza perdere il il file vecchio se la variabile dove !=  2? 

grazie per le risposte che mi darete

P.S. non vorrei duplicare la funzione facendo una per la visualizzazione ed un altra per la stampa su file!

12 Risposte

  • Re: Dubbio su ofstream

    La creazione del file non c'entra nulla.

    Devi ripassare le regole di visibilità delle variabili, regole di base anche per il semplice C 

    Se dichiari la variabile lavoro all'interno della if, questa esisterà solo all'interno del blocco if e non fuori.

  • Re: Dubbio su ofstream

    In quel modo ne crea uno nuovo se non esiste, altrimenti lo apre e cancella il contenuto, in accordo con la chiamata implicita alla funzione open.

    https://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream (vedere costruttore 2)

    https://en.cppreference.com/w/cpp/io/basic_filebuf/open

    Se vuoi preservare il contenuto, usa il parametro ios::app (out è implicito).

    L'errore di sopra è che la variabile non esiste nel secondo if.

  • Re: Dubbio su ofstream

    22/05/2024 - Alexv ha scritto:


    In quel modo ne crea uno nuovo se non esiste, altrimenti lo apre e cancella il contenuto, in accordo con la chiamata implicita alla funzione open.

    https://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream (vedere costruttore 2)

    https://en.cppreference.com/w/cpp/io/basic_filebuf/open

    Se vuoi preservare il contenuto, usa il parametro ios::app (out è implicito).

    L'errore di sopra è che la variabile non esiste nel secondo if.

    grazie per la risposta ma non posso usare l'append perchè il file nel caso l'utente volesse la stampa su file deve essere ricreato mentre con l'append accodo le informazioni.

    purtroppo dovrò fare due funzioni separate visto che non c'è altro modo.

  • Re: Dubbio su ofstream

    22/05/2024 - oregon ha scritto:


    La creazione del file non c'entra nulla.

    Devi ripassare le regole di visibilità delle variabili, regole di base anche per il semplice C 

    Se dichiari la variabile lavoro all'interno della if, questa esisterà solo all'interno del blocco if e non fuori.

    grazie per la risposta 

    visto che il dubbio mi era venuto speravo che con gli oggetti stream fosse diverso.

    pazienza dovrò fare due funzioni separate visto che non c'è altro modo! 

  • Re: Dubbio su ofstream

    23/05/2024 - smalldragon ha scritto:


    visto che il dubbio mi era venuto speravo che con gli oggetti stream fosse diverso.

    Le regole di visibilità delle variabili valgono per tutte le variabili. Perché dovrebbe esserci una differenza per gli oggetto stream?

    Se scrivi 

    if (a==2) {  int x = 10; printf("%d", x); }
    if (a==2) {  x = x + 1; }

    avrai lo stesso errore.

    pazienza dovrò fare due funzioni separate visto che non c'è altro modo! 

    E perché mai?

    Forse non hai capito completamente il problema e la soluzione …

  • Re: Dubbio su ofstream

    23/05/2024 - oregon ha scritto:


    23/05/2024 - smalldragon ha scritto:


    visto che il dubbio mi era venuto speravo che con gli oggetti stream fosse diverso.

    Le regole di visibilità delle variabili valgono per tutte le variabili. Perché dovrebbe esserci una differenza per gli oggetto stream?

    Se scrivi 

    if (a==2) {  int x = 10; printf("%d", x); }
    if (a==2) {  x = x + 1; }

    avrai lo stesso errore.

    pazienza dovrò fare due funzioni separate visto che non c'è altro modo! 

    E perché mai?

    Forse non hai capito completamente il problema e la soluzione …

    il problema l'ho capito ed quando definisco una variabile di blocco resta nel blocco!  

    ho capito anche la soluzione ad ogni if che usa la variabile di stream dovrei ridefinirla

    ofstream lavoro("report mcd.txt", ios::out); la prima volta devo usare
    ofstream lavoro("report mcd.txt", ios::app); dalla seconda definizione in poi

    mi è venuta un altra idea per modificare poco il codice e non dover stare sempre a definire lo stream ma non so come metterla in pratica!

    idea:

    passare nullptr se la variabile dove = 1 e passare il puntatore corretto se la variabile dove = 2

    ma come si passa uno stream come puntatore?

  • Re: Dubbio su ofstream

    No, mi sa che non hai compreso bene.

    La variabile la dichiari fuori da ogni if una volta

    ofstream lavoro("report mcd.txt", ios::out);

    e poi la usi dentro ogni if, ovviamente se sei nella stessa funzione/metodo.

    Altrimenti, posta il codice un po' più completo e mostra meglio i tuoi dubbi

  • Re: Dubbio su ofstream

    Ma il mio dubbio era proprio questo! 

    quello che non riesco a capire è:

    ofstream lavoro("report mcd.txt", ios::out);

    quando esegue questa istruzione l'eventuale vecchio file esistente viene distrutto o meno?

    ti metto un altro pò di codice forse capisci meglio il dubbio

    indy = 0; k = 0;
    if (dove==2) { ofstream lavoro("report mcd.txt", ios::out); }
    ifstream report("report.txt", ios::in);
    if (!report)
    {
    	cout << "file report.txt non trovato!"; return 44;
    }
    report.get(letto);
    while (!report.eof())
    {
    	switch (letto)
    	{
    	case NULL: { break; }
    	case '\n':
    	{
    		reppy[k] = letto; k = 0; indy++;
    		if (indy < 5 || indy>22)
    		{
    		  if (dove == 2) { lavoro << reppy; }
    		  else { cout << reppy; }
    			
    		}
  • Re: Dubbio su ofstream

    Stai facendo confusione.

    Se apri il file con out il file viene creato (il vecchio azzerato).

    Ma il tuo problema è la visibilità della variabile. Tu devi scrivere

    indy = 0;k = 0;
    ofstream lavoro;
    if (dove==2) { lavoro.open("report mcd.txt", ios::out); }
    ...
  • Re: Dubbio su ofstream

    23/05/2024 - oregon ha scritto:


    Stai facendo confusione.

    Se apri il file con out il file viene creato (il vecchio azzerato).

    Ma il tuo problema è la visibilità della variabile. Tu devi scrivere

    indy = 0;k = 0;
    ofstream lavoro;
    if (dove==2) { lavoro.open("report mcd.txt", ios::out); }
    ...

    ok grazie per la spiegazione

    pensavo che quando utilizzassi gli stream per file fossi costretto a dichiarare anche tutto il resto cosi come avevo fatto. 

  • Re: Dubbio su ofstream

    Come fai a programmare in C++ “pensando” senza “studiare” ?

  • Re: Dubbio su ofstream

    23/05/2024 - oregon ha scritto:


    Come fai a programmare in C++ “pensando” senza “studiare” ?

    come ben sai preferisco l'Assembly

    di solito uso un minimo di c++ e poi il resto lo faccio in assembler!

    ma ogni tanto giusto per imparare uso il c++ 

Devi accedere o registrarti per scrivere nel forum
12 risposte