PDA

Visualizza la versione completa : [C++] Salvataggio file risulta vuoto alla riapertura


babi8899
17-02-2011, 22:59
ho scritto un programma in cui scrivo e creo un file,lo stampo a video e poi lo salvo.però c'è un problema:se lo scrivo e lo stampo solamente quando apro il file mi compare quello che ho scritto,se invece lo salvo anche, il file quando lo apro è vuoto,da che dipende?ecco il codice:

#include <iostream>
#include<fstream>
using namespace std;
void stampa_video()//stampo a video il file ciao
{char c;
fstream vale;
vale.open("ciao",ios::in);
while(vale.get(c)) cout<<c;
vale.close();}
void scrivi()//scrivo nel file ciao
{ ofstream vale ("ciao");
if (!vale){ cerr<<"No file"; }
char c;
while(cin.get(c))
{ vale.put(c);
if (c == 'x') break;}
vale.close();}
void salva_file()//salvo il file ciao
{ fstream vale;
char c;
vale.open("ciao",ios::out);
if(vale.good()){ while (vale.get(c)){
vale<<c; } }
vale.close(); }
int main()
{ cout<<"scrivi nel file: "<<endl;
scrivi();
cout<<endl;
stampa_video();
cout<<endl;
salva_file();
system("pause");
return 0; }

shodan
17-02-2011, 23:06
Se usi ofstream, o fstream con ios::out, devi specificare anche ios::app, altrimenti il file verrà azzerato. Però così se ci scrivi qualcosa, finisce in fondo al file.

In alternativa usa fstream con gli specificatori: ios::in | ios::out.

babi8899
17-02-2011, 23:13
quindi se scrivo e salvo devo scrivere in un altro modo perchè sennò me lo azzera?salva_file devo correggere?

MItaly
17-02-2011, 23:33
Io in primo luogo correggerei l'indentazione... così com'è quel tuo codice è illeggibile. :spy:


#include <iostream>
#include<fstream>

using namespace std;

void stampa_video()//stampo a video il file ciao
{
char c;
fstream vale;
vale.open("ciao",ios::in);
while(vale.get(c)) cout<<c;
vale.close();
}

void scrivi()//scrivo nel file ciao
{
ofstream vale ("ciao");
if (!vale)
{
cerr<<"No file";
}
char c;
while(cin.get(c))
{
vale.put(c);
if (c == 'x') break;
}
vale.close();
}

void salva_file()//salvo il file ciao
{
fstream vale;
char c;
vale.open("ciao",ios::out);
if(vale.good())
{
while (vale.get(c))
{
vale<<c;
}
}
vale.close();
}

int main()
{
cout<<"scrivi nel file: "<<endl;
scrivi();
cout<<endl;
stampa_video();
cout<<endl;
salva_file();
system("pause");
return 0;
}

shodan
17-02-2011, 23:36
A rigor di logica non salvi niente visto che leggi un carattere e lo rimetti dentro.
Ho modificato un pò il codice in modo che siano chiari i passaggi.


#include <iostream>
#include <fstream>
#include <string>
using namespace std;

//stampo a video il file ciao
void stampa_video() {
fstream vale("ciao",ios::in);
string line;
while (getline(vale,line))
cout << line << endl;
vale.close();
}

// scrivo nel file ciao distruggendo ogni volta il contenuto.
void scrivi_qualcosa () {
ofstream vale ("ciao", ios::out );
if (!vale) { cerr<<"No file"; return; }
string line;
getline(cin,line);
vale << line;
vale.close();
}

// scrivo nel file ciao aggiungendo ogni volta il contenuto.
void scrivi_qualcosa_altro() {
fstream vale("ciao",ios::out | ios::app) ;
string line;
getline(cin,line);
vale<<line;
vale.close();
}

int main() {
cout<<"scrivi nel file: "<<endl;
scrivi_qualcosa();
cout<<endl;

stampa_video();
cout<<endl;
scrivi_qualcosa_altro();

stampa_video();
cin.get();
return 0;
}

alka
18-02-2011, 10:41
Il linguaggio va indicato anche nel titolo, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887).

Qui l'ho aggiunto io. Tienilo a mente per il futuro.

Loading