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..