Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55

    [C++] Dubbio scrittura su file

    Salve ragazzi ho un problemino con questo codice..

    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?

  2. #2
    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()

    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;
        cout<<x<<" "<<y<<endl;
        
        in.ignore(256, '\n'); // Ignora il ritorno a capo
    
        getline( in, h);
        cout<<"'"<<h<<"'";
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    non capisco questo
    codice:
     
     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?

  4. #4
    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()
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    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

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