Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C++] Dov'è l'errore?

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    14

    [C++] Dov'è l'errore?

    Ho creato per prova in c++ un semplice editor.
    Questo è il codice:

    codice:
    #include <iostream.h>
    #include <stdlib.h>
    #include <fstream.h>
    #include <string>
    
    int main()
    {
          string nomefile;
          string testo;
          cout << "Come si chiama il file che vuoi creare?\n";
          getline(cin, nomefile);
          cout << endl;
          ifstream ifile(nomefile.c_str());
          if(!ifile)
          {
           cout << "Il file non esiste e verra' creato...\n";
           ofstream ofile(nomefile.c_str());
          }
          else
          {
           cout << "Il file e' gia' esistente. Questo è il file:\n\n\n----------------\n";
           string line;
           while (!ifile.eof())
           {
            getline(ifile, line);
            cout << line << endl;
           }
           ifile.close();
           cout << "-----------\nFine del file.\n\nDesideri [A]ggiungere informazioni o [S]ovrascriverle?\n";
           string scelta;
           int iscelta;
           cin >> scelta;
           if (scelta == "A" || scelta == "a")
           {
            iscelta = 1;
           }
           if (scelta == "S" || scelta == "s")
           {
            iscelta =  2;
           }
           if (iscelta == 1)
           {
            ofstream ofile(nomefile.c_str(), ios::app);
           }
           else if (iscelta == 2)
           {
            ofstream ofile(nomefile.c_str(), ios::trunc);
           }
           else
           {
            cout << "Stupido! Dovevi premere \"A\" o \"S\"!";
            system("PAUSE");
            return 1;
           }
    
          }
          if (! ofile)
          {
           cout << "Errore!\n";
           return 1;
    
          }
          else
          {
           cout << "Ok, file aperto. Cosa vuoi scrivere nel file?\n";
           getline(cin, testo);
           cout << endl;
           ofile << testo;
           cout << "File scritto!";
           ofile.close();
          }
          system("PAUSE");
          return 0;
    }
    ho 2 problemi: il codice così com'è, in dev bloodshed, mi dà il seguente errore:

    In function `int main()':
    57: `ofile' undeclared (first use this function)
    57: (Each undeclared identifier is reported only once
    57: for each function it appears in.)

    Il problema è quell' (!ofile). Non capisco perchè il compilatore faccia storie, non si può passare da quel pezzo di codice senza essere passati da uno degli ofstream ofile(blablabla).
    Se dichiaro ofile all'inizio del programma senza argomenti, i vari ofile successivi non hanno effetto e non posso scrivere sul file.
    Altro problema: In questo programma chiedo 3 input dall'utente: nomefile, scelta e testo. Dopo nomefile posso chiedere scelta senza problemi, ma quando chiedo testo se non prepongo cin.ignore() alla richiesta di input l'input viene richiesto ed autofornito con un acapo. Da quello che ho capito è un invio "latente" dai primi input che soddisfa subito la richiesta del 3o input. Ma perchè non si presenta con la seconda richiesta?
    Inoltre: perchè ad una "é" nel codice non corrisponde una "è" di output? Set di caratteri diverso?

    Thx

  2. #2
    1. xchè usi 2 if per settare l'ofile, non penso sia quello il problema ma i 2 if sono inutili. Se entri in uno dei 2 if (quando ci sono + casi è consigliabile usare il ciclo switch) setta lì ofile e non far eseguire un altro if inutile, a meno che tu non abbia bisogno di sapere in futuro la scelta fatta

    2. non so che versione hai del compilatore ma, anche se sembra assurdo, hai provato a testare !ofile invece di ! ofile? non ricordo se c'è differenza.

    3. se non sbaglio (non ricordo se vale x il c o c++ o tutti e due) l'input è bufferizzato, forse devi provare a fare un flush del buffer prima del nuovo input.

  3. #3
    Ti da errore poiche fuori dell'if ofile nn esiste!
    é un errore di visibilità delle variabili.
    Se io faccio:
    codice:
    int i
    
    int main()
    {
    }
    i è globale
    Ma se faccio
    codice:
     
    int main()
    {
      int i
    }
    La var i è locale e chiusa la } nn esiste piu perche cancellata dallo stack.
    Spero di averti cosi aiutato.



    Ciao
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  4. #4
    codice:
    #include <iostream>
    #include <cstdlib>
    #include <fstream>
    #include <cstring>
    #include <string>
    
    using namespace std;
    
    ofstream ofile;
    
    int main()
    {
    string nomefile;
    string testo;
    cout << "Come si chiama il file che vuoi creare?\n";
    getline(cin, nomefile);
    cout << endl;
    ifstream ifile(nomefile.c_str());
    if(!ifile)
    {
    cout << "Il file non esiste e verra' creato...\n";
    ofstream ofile(nomefile.c_str());
    }
    else
    {
    cout << "Il file e' gia' esistente. Questo è il file:\n\n\n----------------\n";
    string line;
    while (!ifile.eof())
    {
    getline(ifile, line);
    cout << line << endl;
    }
    ifile.close();
    cout << "-----------\nFine del file.\n\nDesideri [A]ggiungere informazioni o [S]ovrascriverle?\n";
    string scelta;
    int iscelta;
    cin >> scelta;
    if (scelta == "A" || scelta == "a")
    {
    iscelta = 1;
    }
    if (scelta == "S" || scelta == "s")
    {
    iscelta = 2;
    }
    if (iscelta == 1)
    {
    ofstream ofile(nomefile.c_str(), ios::app);
    }
    else if (iscelta == 2)
    {
    ofstream ofile(nomefile.c_str());
    }
    else
    {
    cout << "Stupido! Dovevi premere \"A\" o \"S\"!";
    system("PAUSE");
    return 1;
    }
    
    }
    
    if (!ofile)
    {
        cout << "Errore!\n";
        return 1;
    }
    
    else
    {
    cout << "Ok, file aperto. Cosa vuoi scrivere nel file?\n";
    getline(cin, testo);
    cout << endl;
    ofile << testo;
    cout << "File scritto!";
    ofile.close();
    }
    system("PAUSE");
    return 0;
    }
    Te l'ho un po corretto ma guarda che nn scrive nulla.
    Ciao
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    14
    è vero... la variabile è locale... c'è un modo per dichiarare una variabile globale?

  6. #6
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    Originariamente inviato da Maranza
    è vero... la variabile è locale... c'è un modo per dichiarare una variabile globale?
    basta dichiararla prima di qualunque funzione.
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    14
    è quello che ho provato a fare con ofstream ofile all'inizio, ma poi non scrive niente nel file... non capisco perchè... temo che sia perchè il puntatore ofile non si può aprire 2 volte...
    nella riga ofile << testo dovrebbe scrivere...
    vi assicuro che fino alla linea prima testo contiene l'input dell'utente.

  8. #8
    invece di ios::trunc o ios::app, non puoi inserire delle costanti? del tipo "wr" scrittura e lettura

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    14
    se l'avessi saputo...
    nella guida su fstream che ho letto i modi di apertura file sono tutti con ios::qualcosa, non ci sono stringhe. oltre a wr quali sono le altre stringhe valide?

    così posso aprire con ofstream ofile(file, modo) no?

  10. #10
    ho riguardato il manuale e tutti gli esempi portano portano ios_base non solo ios. Per le stringhe devo trovare il libro di sistemi operativi, appena so qualcosa ti faccio sapere

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 © 2024 vBulletin Solutions, Inc. All rights reserved.