Salve. Intanto mi presento.. sono nuovo di questo forum

Stavo provando a scrivere un po' di codice per approfondire gli stream da/sui file del c++. Questo è il codice "padre".

codice:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
using namespace std;

void find_file(fstream & file, int choice);
void text_insert(fstream & file);
void error(int a);
void read(fstream & file);
void close(fstream & file);


main(){
       fstream file;
       int control;   // variabile di controllo della selezione
       cout << "Scrittura/lettura su File. Scegliere cosa fare:" << endl << endl;
       cout << "[1] Scrivere su file" << endl;
       cout << "[2] Leggere un file" << endl;
       cout << "[3] Uscire dal programma" << endl << endl;
       cout << "Numero selezione: ";
       cin >> control;
       switch(control){
                       case 1:          break;
                       case 2:          find_file(file, 1);  /*chiamata alla 
apertura del file in modalità lettura*/
                                        read(file); // lettura
                                        close(file); // chiusura del file
                                        break; 
                       case 3:          exit(0); //chiusura del programma
                       default:         error(1); /*sbaglio nel digitare 
il numero. Chiamata alla funzione error */
                       }
       cout << endl << "Scrittura su File. Scegliere cosa fare:" << endl << endl;
       cout << "[1] Sovrascrivere il file" << endl;
       cout << "[2] Aggiungere testo alla fine del file" << endl << endl;
       cout << "Numero selezione: ";
       cin >> control;
       switch(control){
                       case 1:          find_file(file, 2); /* chiamata 
apertura file in modalità write*/
                                        text_insert(file);  //inserimento testo
                                        close(file); //chiusura del file
                                        break;
                       case 2:          find_file(file, 3); /*chiamata apertura 
file in modalità "append" */
                                        text_insert(file); // inserimento testo
                                        close(file); //chiusura del file
                                        break;
                       default:         error(1);}
       }                       

void find_file(fstream & file, int choice){
                  char indirizzo[100];     
                  cout << endl << "Inserire il percorso del file da leggere ";
                  cout << "o da scrivere, con l'estensione " << endl;
                  gets(indirizzo);
                  switch(choice){
                                 case 1:    file.open(indirizzo, ios::in);  
//apertura in modalità read
                                            break;
                                 case 2:    file.open(indirizzo, ios::out); 
//apertura in modalità write
                                            break;
                                 case 3:    file.open(indirizzo, ios::app); 
//apertura in modalità append
                                            break;
                                 default:   error(4);
                                 }
                  if(!file){  //controllo sul caricamento del file
                             error(2); //se non è caricato, chiama la funzione error
                             }
                  cout << endl << "Caricamento del file eseguito correttamente" << endl << endl;
                  }
                  
void text_insert(fstream & file){
                          cout << "Inserire il testo da copiare nel file destinazione, ";
                          cout << "quando vuoi terminare l'inserimento ";
                          cout << " scrivi / e premi invio." << endl << endl;
                          string a = "\0";
                          string b = "/";
                          while(cin.good()){ //finchè l'acquisizione è corretta
                                 a = cin.get(); //acquisisci un carattere
                                 if(a == b) /*controllo sull'inserimento 
di "/" che fa terminare l'inserimento*/
                                 break;
                                 file << a; //stampa nel file il carattere acquisito
                                 }
                          cout << endl << "Scrittura completata con successo" << endl;          
                          }
              
void read(fstream & file){
              char a;
              cout << endl;
              while(file.eof()!= true){  // finchè il file non è finito, leggilo :)
                                        a = file.get();  //estrai un carattere dal file
                                        cout << a; //stampa a video il carattere
                                       }
              cout << endl << endl << "Lettura completata con successo." << endl;
              }             
              
void close(fstream & file){
                   int choice;
              file.close(); //chiusura del file
              cout << "Programma terminato con successo! Vuoi riavviarlo?" << endl << endl;
              cout << "[1] Yes" << endl;
              cout << "[2] No" << endl << endl;
              cout << "Numero selezione ";
              cin >> choice;
              switch(choice){
                             case 1:      cout << endl << "Riavvio programma " << endl << endl;
                                          main(); //chiamata al main, riavvio del programma
                             case 2:      cout << "Programma terminato";
                                          exit(0); //uscita dal programma
                             default:     error(1);
                             }
              }

void error(int a){
          switch(a){
                    case 1:      cout << endl << "E' stato inserito una lettera ";
                                    cout << "o un numero non valido" << endl; 
                                 break;
                    case 2:      cout << endl << "Errore nel caricamento del file, ";
                                    cout << "o il file non esiste" << endl;
                                 break;
                    default:     cout << endl << "Errore imprevisto" << endl;
                    }
          cout << "Programma riavviato" << endl << endl;
          main();
          }

Allora questo è il codice padre, diciamo.. L'errore non è nè in fase di compilazione, nè di linking. Ce ne sono un paio di errori:

il primo- ho analizzato il file in modalità debug e ho visto che la funzione "gets(indirizzo)" non viene chiamata-- cioè quello che accade è che dopo aver scritto: "Inserire il percorso del file da leggere o da scrivere, con l'estensione" non aspetta che io inserisca il percorso, ma il programma va avanti e chiaramente mi sputa fuori l'errore di non caricamento del file.

Volendo potrei usare un'alternativa a gets ma non capisco perchè non funzioni.. come funziona per esempio in questo pezzo di codice del tutto identico:

codice:
#include <iostream>
#include <fstream>
using namespace std;
main(){
       fstream file;
       char indirizzo[100];     
            cout << endl << "Inserire il percorso del file da leggere o da scrivere, ";
            cout << "con l'estensione " << endl;
                  gets(indirizzo);
                  file.open(indirizzo, ios::out);
                  if(!file){
                             cout << "Errore caricamento file";
                             main();
                             }
                  cout << endl << "Caricamento del file eseguito correttamente" << endl << endl;
                  cout << "Inserire il testo da copiare nel file destinazione, quando ";
                  cout << "vuoi terminare l'inserimento scrivi / e premi invio." << endl << endl;
                  string a = "\0";
                  string b = "/";
                  while(cin.good()){
                  a = cin.get();
                  if(a == b)
                  break;
                  file << a;
                  }
                  cout << endl << "Scrittura completata con successo" << endl;     
                  int choice;
              file.close();
              cout << "Programma terminato con successo! Vuoi riavviarlo?" << endl << endl;
              cout << "[1] Yes" << endl;
              cout << "[2] No" << endl << endl;
              cout << "Numero selezione ";
              cin >> choice;
              switch(choice){
                             case 1:      cout << endl << "Riavvio programma " << endl << endl;
                                          main();
                             case 2:      cout << "Programma terminato";
                                          exit(0);
                             default:     cout << "Errore";
                                          main();
                             }
}
Questo codice funziona benissimo.. si ferma al gets e mi fa inserire l'indirizzo.. mah


Il secondo errore, invece, è dovuto al fatto forse che non ho ben capito la modalità append.. Cioè prendendo lo stesso codice che ho postato qua sopra (il secondo dei due postati) e mettendo:

ios::app invece di ios:ut

mi da sempre "Errore caricamento file".. cioè come se il file non fosse aperto--

Qualcuno che abbia l'enorme pazienza di leggersi questo papiro.. Ne sarei grato ^^


P.S. alcuni pezzi di codice che potevano benissimo stare in una sola riga, li ho spezzati in due adesso in modo che non facesse venire l'odiosa barra di scorrimento orizzontale..