Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13

Discussione: [C++] std::cin

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Direi che l'implementazione 'elastica' e' quanto di meglio si possa avere tra le mani da usare, e credo che ne capiro' a fondo le potenzialita' quando usero' i file.

    Inoltre mi sembra di capire quindi che le funzioni atoi, atof, che avevo provato ad usare per prendere dei numeri da un file di testo, e' meglio lasciarle stare, in quanto mischierei qualcosa di C con C++, corretto ? (v. qui, dice che come parametro di input prende una C-string, quindi del tipo char*).

    Ieri ho fatto qualche prova, e mi sono bloccato quando ho usato la funzione read per fare l'input di un char (punto in cui si chiede di mettere s per 'si' e n per 'no').

    A parte verificare di non aver fatto qualche errore grossolano io, guardando anche qui mi sembra di capire che l'operatore >> per gli istream non sia stato espressamente implementato per i char.

    Quindi il dubbio e' il seguente:
    1. tratto il char come un int? Del resto anche la funzione get fa lo stesso...(v. qui prima funzione del numero 1);
    2. non uso char, ma uso string, anche se per un solo carattere;
    3. implemento una terza funzione read appositamente per i char.


    P.S.: ho messo i link per quelli come me che 'non sanno' di cosa stanno parlando, per chi mastica il C++, credo siano cose stranote...

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quote Originariamente inviata da ing82 Visualizza il messaggio
    Inoltre mi sembra di capire quindi che le funzioni atoi, atof, che avevo provato ad usare per prendere dei numeri da un file di testo, e' meglio lasciarle stare, in quanto mischierei qualcosa di C con C++, corretto ? (v. qui, dice che come parametro di input prende una C-string, quindi del tipo char*).
    Molte API C++ sono implementate tramite le API C (altrimenti non avrebbe senso parlare di riusabilità del codice), tuttavia è pericoloso se non si sa cosa si sta facendo nei dettagli. Dettagli che probabilmente ti saranno chiari una volta studiati i libri di Eckel (fermi al C++ 98), ma sempre validi per iniziare.

    In caso il tuo compilatore le supporti puoi usare le funzioni descritte qui per convertire stringhe in numeri.
    http://en.cppreference.com/w/cpp/str...ic_string/stol
    http://en.cppreference.com/w/cpp/str...ic_string/stof
    (poco più di wrapper per atoi e atof).


    A parte verificare di non aver fatto qualche errore grossolano io, guardando anche qui mi sembra di capire che l'operatore >> per gli istream non sia stato espressamente implementato per i char.
    Tale operatore è definito anche per i char, ma non come funzione membro.
    http://www.cplusplus.com/reference/i...operator-free/
    (è nel link da te postato appena sotto i manipulators)
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Dopo una lunga pausa estiva, ho ripreso in mano quanto stavo facendo, e ho provato a implementare il metodo read in questo modo, cioè che restituisce true se l'input viene validato, false in caso contrario.

    Qui sotto ho incollato il codice relativo all'input di un unsigned int, di cui puo' essere specificato o meno un intervallo a piacere dell'utente, ad esempio l'input deve essere tra 10 e 20, estremi compresi (pre int, char, double cambia qualcosa all'interno del corpo della funzione, ma l'impostazione e identica).

    codice:
    boolMyValidator::read(std::istream& is,unsigned int& data,const unsigned int& min_val,const unsigned int& max_val) 
    {  
    std::string line;
    do
    {
    std::getline(is,line);
    }while(line.empty()); 
    
    int data2; 
    std::istringstream iss(line);
    iss>>data2;
    if(!iss||!iss.eof())
    { 
    return false; 
    } 
    else if(data2<0) 
    { 
    return false; 
    } 
    data=static_cast<unsigned int>(data2); 
    if((data<min_val)||(data>max_val)) 
    { 
    return false; 
    } 
    else 
    { 
    return true;
     }
    }

    in questo modo nel main o dove serve l'input puo' essere fatto in questo modo

    codice:
    while(!MyValidator::read(std::cin,scelta,0,1000)) 
    { 
    std::cout<<"\nInput errato\n"; 
    }
    Qualcuno ha ulteriori suggerimenti / critiche, alla luce di un possibile utilizzo coi file?
    Ultima modifica di ing82; 25-09-2016 a 19:13

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