PDA

Visualizza la versione completa : [C++] Dubbio scrittura su file


vicio_93
15-01-2015, 16:47
Salve ragazzi ho un problemino con questo codice..



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

int main(){
ofstream out("ciao.txt");
out<<10<<12<<endl;
out<<"fine prova";
out.close();

ifstream in ("ciao.txt");
if (!in) return -1;
int x,y;
string h;
in>>x>>y>>h;
cout<<x<<y<<endl;
cout<<h;
}


L'output è solo 10120; cioè ha messo uno zero in più e ha mangiato la stringa "fine prova". Come mai?

Samuele_70
15-01-2015, 21:09
Fai attenzione agli spazi, se in scrittura non separi i due valori interi, in fase di lettura verranno letti come un unico valore intero.
Per quanto riguarda la lettura della stringa contenente spazi, devi usare la funzione getline()



#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
ofstream out("ciao.txt");
out<<10<<" "<<12<<endl;
out<<"fine prova";
out.close();

ifstream in ("ciao.txt");
if (!in)
return -1;
int x,y;
string h;
in>>x>>y;
cout<<x<<" "<<y<<endl;

in.ignore(256, '\n'); // Ignora il ritorno a capo

getline( in, h);
cout<<"'"<<h<<"'";
}

vicio_93
15-01-2015, 23:54
non capisco questo

in.ignore(256, '\n');


Poi pure se non metto la getline, la copia dallo stream che ho fatto io non dovrebbe prendere la prima parola, cioè "fine"? Perchè stampa lo 0?

Samuele_70
16-01-2015, 01:20
La ignore() serve per ignorare tutti gli eventuali caratteri fino al ritorno a capo (compreso), altrimenti la getline() non leggerebbe la riga successiva.
Come ti ho già scritto, se al momento della scrittura non separi i due valori interi, nella successiva fase di lettura ti ritrovi con x=1012, e y=0.
la variabile y vale 0 perché l'operatore di estrazione >> fallisce nella ricerca di un secondo valore intero dallo stream, l'indice nello stream punterà alla fine del file, vengono settati i bit di stato che segnalano lo stato e gli errori e tutti i seguenti tentativi di lettura dallo stream falliscono fintanto che non vengono resettati chiamando la funzione membro clear()

vicio_93
16-01-2015, 12:34
Quindi se ho capito bene l'operazione di estrazione dallo stream per la variabile x finisce quando non trova più valori interi (nel mio caso non avendo messo lo spazio ad x assegnava 1012, per y invece lo zero è dovuto alla new line oppure alla stringa? Cioè successivamente considerla la new line come valore da estrarre o no?). La ignore invece serve, nel mio caso, per ignorare la new line e non assegnarla ad h? Poi perchè il valore 256? Spero di essermi spiegato bene. Grazie per la risposta :D

Loading