[Coding] problema con getline...!
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 9 di 9

Discussione: problema con getline...!

Cambio titolo
  1. #1
    Grayfox1893
    Ospite

    problema con getline...!

    ciao raga guardate questo codice, in pratica qualunque frase io metta, cout mi restituisce la frase senza la prima parola, anche se faccio iniziare la frase con degli spazi... come mai?
    Codice:
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    int main (){
        string frase;
        cin >> frase;
    
        getline(cin, frase);
    
        cout<<frase;
        while(cin.get() != 'Z')
        return 0;
    }
    inoltre non capisco la differenza tra get line e cin.getline...

    da quello che ho capito in getline si usa così; getline(cin, variabile stringa)
    mentre cin.getline così ; cin.getline(nome stringa , dimensione, limite oltre il quale non andare)

    ma se uso cin.getline in questo caso mi da errore!
    vorrei anche sapere... in cin.getline, la dimensione deve essere quella esatta della frase o un valore limite? grazie mille

  2. #2
    panzone
    Ospite
    Citazione Grayfox1893 Visualizza Messaggio
    ciao raga guardate questo codice, in pratica qualunque frase io metta, cout mi restituisce la frase senza la prima parola, anche se faccio iniziare la frase con degli spazi... come mai?
    Codice:
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    int main (){
        string frase;
        cin >> frase;
    
        getline(cin, frase);
    
        cout<<frase;
        while(cin.get() != 'Z')
        return 0;
    }
    inoltre non capisco la differenza tra get line e cin.getline...

    da quello che ho capito in getline si usa così; getline(cin, variabile stringa)
    mentre cin.getline così ; cin.getline(nome stringa , dimensione, limite oltre il quale non andare)

    ma se uso cin.getline in questo caso mi da errore!
    vorrei anche sapere... in cin.getline, la dimensione deve essere quella esatta della frase o un valore limite? grazie mille
    Perchè usi cin>>frase. Questo svuota il buffer dello stdin salvandolo in frase. Quando poi fai getline ricarichi il buffer e lo lo stampi sovrascrivendo frase. Quindi hai una perdita di informazione.

    Infine la dimensione rappresenta un semplice limite.

  3. #3
    Grayfox1893
    Ospite
    Citazione panzone Visualizza Messaggio
    Perchè usi cin>>frase. Questo svuota il buffer dello stdin salvandolo in frase. Quando poi fai getline ricarichi il buffer e lo lo stampi sovrascrivendo frase. Quindi hai una perdita di informazione.

    Infine la dimensione rappresenta un semplice limite.
    grazie mille della disponibilità!
    cioè mi stai dicendo che nel momento in cui inserisco una frase essa viene messa nel buffer dello stdin.. poi faccio getline, che in pratica memorizzanel buffer la frase che ho inserito .perciò il problema si verifica nella stampa? cioè, nonostante la frase sia memorizzata intera nel buffer, cout, per stampare, deve utilizzare il buffer per cui rovina le informazioni? per cui devo salvare la frase non nel buffer ma da qualche altra parte? ma allora a cosa serve getline?

    grazie anche per la questione della dimensione

  4. #4
    panzone
    Ospite
    Citazione Grayfox1893 Visualizza Messaggio
    grazie mille della disponibilità!
    cioè mi stai dicendo che nel momento in cui inserisco una frase essa viene messa nel buffer dello stdin.. poi faccio getline, che in pratica memorizzanel buffer la frase che ho inserito .perciò il problema si verifica nella stampa? cioè, nonostante la frase sia memorizzata intera nel buffer, cout, per stampare, deve utilizzare il buffer per cui rovina le informazioni? per cui devo salvare la frase non nel buffer ma da qualche altra parte? ma allora a cosa serve getline?

    grazie anche per la questione della dimensione
    No. Facciamo un esempio va, che effettivamente son poco chiaro.

    Ho un input cosi formattato:

    Ciao sono andrea

    Ora, cosa succede. cin>>frase trasferisce una stringa in frase, ovvero legge l' input e mi trasferisce la stringa "Ciao" in frase. In cin ""resta"" "sono andrea\n"

    Dopo fai un getline su cin. GetLine legge lo stream fino a che non incontra un \n e salva la stringa che ricava. Dunque frase viene sovrascritta ( perchè ci salvi sopra ) e resta "sono andrea".

    Dunque dopo quando butti frase sull' stdout, ovviamente stamperà tutto fuorchè la prima parola.

    Ora, vedi a cosa serve getLine ? GetLine riporta l' intera stringa, spazi inclusi, fino al \n, mentre >> ritorna la prima parola spazi esclusi ( questo perchè frase è un oggetto di tipo string. Se hai esperienza con la programmazione C, vedilo come una specie di overloading su fscanf ed i suoi vari case ).
    Ultima modifica di panzone; 26-01-2013 alle 13:13:32

  5. #5
    Grayfox1893
    Ospite
    Citazione panzone Visualizza Messaggio
    No. Facciamo un esempio va, che effettivamente son poco chiaro.

    Ho un input cosi formattato:

    Ciao sono andrea

    Ora, cosa succede. cin>>frase trasferisce una stringa in frase, ovvero legge l' input e mi trasferisce la stringa "Ciao" in frase. In cin ""resta"" "sono andrea\n"

    Dopo fai un getline su cin. GetLine legge lo stream fino a che non incontra un \n e salva la stringa che ricava. Dunque frase viene sovrascritta ( perchè ci salvi sopra ) e resta "sono andrea".

    Dunque dopo quando butti frase sull' stdout, ovviamente stamperà tutto fuorchè la prima parola.

    Ora, vedi a cosa serve getLine ? GetLine riporta l' intera stringa, spazi inclusi, fino al \n, mentre >> ritorna la prima parola spazi esclusi ( questo perchè frase è un oggetto di tipo string. Se hai esperienza con la programmazione C, vedilo come una specie di overloading su fscanf ed i suoi vari case ).
    aaaaaaahhh!!! ho capito, perciò getline salva in frase ciò che "c'è" in cin, io invece pensavo salvasse da qualche parte il contenuto di frase che ho messo in cin! ok allora proprio non avevo capito! grazie mille!

    ma allora come faccio a salvare in "frase" una frase completa? che alla fine era quello che volevo fare, inserire una frase e salvarla appunto in "frase" solo che come mi hai detto te mi salva solo la prima parola mmm...

  6. #6
    panzone
    Ospite
    Citazione Grayfox1893 Visualizza Messaggio
    aaaaaaahhh!!! ho capito, perciò getline salva in frase ciò che "c'è" in cin, io invece pensavo salvasse da qualche parte il contenuto di frase che ho messo in cin! ok allora proprio non avevo capito! grazie mille!

    ma allora come faccio a salvare in "frase" una frase completa? che alla fine era quello che volevo fare, inserire una frase e salvarla appunto in "frase" solo che come mi hai detto te mi salva solo la prima parola mmm...
    Non hai capito niente allora. In cin tu non metti un cazzo, tu prelevi da li. Se togli quel cin>>frase, vedrai che andrà. Perchè ? Perchè getline prenderà tutto fino al primo \n che incontra.

  7. #7
    Grayfox1893
    Ospite
    Citazione panzone Visualizza Messaggio
    Non hai capito niente allora. In cin tu non metti un cazzo, tu prelevi da li. Se togli quel cin>>frase, vedrai che andrà. Perchè ? Perchè getline prenderà tutto fino al primo \n che incontra.
    ma lol io pensavo che si potessero inserire frasi se e solo se nel foglio c++ ci fosse scritto "cin>>"...!!

    ok cmq ho fatto un pò di prove ora ho capito!

    ti ringrazio di cuore, non credo che avrei mai capito da solo!

    ecco

    Codice:
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    int main (){
        string frase;
        
        
        
            
    cout<<"come ti chiami?"<<endl;
        getline(cin, frase);
    
    
        cout<<"adesso so il tuo nome! guarda: ti chiami ";
        
            cout<<frase<<endl;
        
        system("pause");
        return 0;
    }
    Ultima modifica di Grayfox1893; 26-01-2013 alle 15:35:24

  8. #8
    panzone
    Ospite
    Citazione Grayfox1893 Visualizza Messaggio
    ma lol io pensavo che si potessero inserire frasi se e solo se nel foglio c++ ci fosse scritto "cin>>"...!!

    ok cmq ho fatto un pò di prove ora ho capito!

    ti ringrazio di cuore, non credo che avrei mai capito da solo!

    ecco

    Codice:
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    int main (){
        string frase;
        
        
        
            
    cout<<"come ti chiami?"<<endl;
        getline(cin, frase);
    
    
        cout<<"adesso so il tuo nome! guarda: ti chiami ";
        
            cout<<frase<<endl;
        
        system("pause");
        return 0;
    }
    Questo perchè chiunque ti stia insegnando C++ non ti ha insegnato il concetto di stream Se si vuole giocare con C o C++ è tassativo andare a vedere queste cose a basso livello

  9. #9
    Read Only Member L'avatar di Sinus
    Registrato il
    05-09
    Messaggi
    719
    Citazione Grayfox1893 Visualizza Messaggio
    ciao raga guardate questo codice, in pratica qualunque frase io metta, cout mi restituisce la frase senza la prima parola, anche se faccio iniziare la frase con degli spazi... come mai?
    Codice:
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    int main (){
        string frase;
        cin >> frase;
    
        getline(cin, frase);
    
        cout<<frase;
        while(cin.get() != 'Z')
        return 0;
    }
    inoltre non capisco la differenza tra get line e cin.getline...

    da quello che ho capito in getline si usa così; getline(cin, variabile stringa)
    mentre cin.getline così ; cin.getline(nome stringa , dimensione, limite oltre il quale non andare)


    ma se uso cin.getline in questo caso mi da errore!
    vorrei anche sapere... in cin.getline, la dimensione deve essere quella esatta della frase o un valore limite? grazie mille
    Mi sembra che a questo tu non abbia avuto risposta.
    getline() e cin.getline() sono due funzioni equivalenti, ma agiscono "per conti" diversi. Cerco di spiegarmi meglio, non so se tu stia studiando il C con l'utilizzo del cin e cout al posto di scanf e printf, o stia studiando direttamente il C++, ma se hai presente il concetto di classe la spiegazione è molto semplice. La notazione cin.getline() dovrebbe farti già capire a priori che la funzione che invochi non è altro che un metodo della variabile globale (oggetto) nominato "cin" (definito nel namespace std), mentre il semplice getline() è una funzione a se stante, che non è correlata ad alcun oggetto specifico.
    Ripeto, dal punto di vista funzionale sono equivalenti, ma col cin.getline hai, in generale, una scelta più vasta sulla modalità di inserimento (cioè puoi decidere a quale carattere della frase fermarti, cosa che nel getline() di base non hai, a meno di una definizione aggiuntiva della getline() che non conosco...), infatti il terzo parametro della cin.getline non è quel "limite oltre il quale non andare" che hai scritto tu e non significa niente, ma è un char che indica il carattere da incontrare per fermarsi prima di aver raggiunto la dimensione massima posta in ingresso.

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •