Duda sobre algunas funciones de C++

Iniciado por vojok, 2 Enero 2016, 17:01 PM

0 Miembros y 2 Visitantes están viendo este tema.

vojok

Hola, estoy armando un programita en C++ sobre el control de alumno (lo armo para mi) y me surge un problema que cuando quiero guardar el nombre y apellido separado por un espacio no me lo guarda con Cin ,entonces estuve buscando y probe con Cin.getline(variable,longitud,caracter de fin); pero tampoco me funciona me tira error como que no es standar y no se que mas , entonces probe con getline(cin,variable); y este me funciono pero estuve buscando y no se bien para que sirve estas funciones, alguien me podria aclararlas?:

Cin.getline();

getline(cin,variable);//no entiendo para que va el cin en el primer parametro ni cual es la funcion

cin.get();//este ultimo lo vi mucho para pausar el programa pero no se su verdadera funcion.

getch();//esto me parece que es para C

ivancea96

Empezando por getline: http://www.cplusplus.com/reference/string/string/getline/
Código (cpp) [Seleccionar]
getline(istream& is, string& str);
Guarda lo leído hasta el salto de línea (o hasta el delimitador, si se lo pones). Lo guarda en el segundo parámetro.
El primer parámetro, es un stream de entrada. Por ejemplo, cuando escribes en consola y pulsas enter, envías la cadena al streaming de entrada del programa ("cin" es un objeto que maneja el streaming de entrada por defecto)
Así pues, de forma resumida y usando tu ejemplo, le dices que lea de "cin", y lo deposite en "variable"

Luego, cin.getline, o más precisamente, el método getline de los objetos "istream", hace lo mismo que la función getline anterior, pero en este caso, los almacena en una cadena de tipo "char*", en vez de en una string. Si utilizas C++, salvo que sea necesario, te recomiendo usar la anterior: "getline(cin, t)"

Mientras que getline obtiene todos los caracteres hasta el delimitador, get obtiene solo 1 caracter.
Información más detallada, la tienes en http://www.cplusplus.com/reference/istream/istream/get/

No se recomienda el uso de getch puesto que no es estándar. Su función es devolver un caracter correspondiente a la siguiente pulsación de tecla (no requiere pulsar enter)

vojok

muchas gracias por responder y tomarte el tiempo de explicarlo , ahora me surgio un problema cuando le pongo el getline() me saltea la linea para poner el nombre y apellido y se va a la otra columna fecha no se que estoy haciendo mal ,la columna los manejo con gotoxy aca el codigo:



class Menu
{
private:
    char sal;
    string nombre,fecha,nivel;
    int clases,seminario,abono;

    public:

        void NuevoAlumno();
        void Lista_Alumno();
        void Modificar_Alumno();
        void Borrar_alumno();
        void Salir();

};

void Menu::NuevoAlumno()
{
    system("cls");
    gotoxy(2,5);
    cout <<"Nombre y apellido:"<<endl;

    gotoxy(27,5);
    cout <<"Fecha:"<<endl;


    gotoxy(43,5);
    cout <<"Clases:"<<endl;

    gotoxy(55,5);
    cout <<"Seminario:"<<endl;


    gotoxy(70,5);
    cout <<"Nivel:"<<endl;


    gotoxy(87,5);
    cout <<"Abono:"<<endl;



    gotoxy(2,7);
    getline(cin,nombre);//aca me saltea la linea y va directo a que ponga la fecha

    gotoxy(27,7);
    cin>>fecha;

    gotoxy(43,7);
    cin>>clases;

    gotoxy(55,7);
    cin>>seminario;

    gotoxy(70,7);   
    getline(cin,nivel);//lo mismo que en el nombre me salta y va directo a abono

     gotoxy(87,7);
    cin>>abono;



}


ivancea96

He visto que usas "cin>>" en algunos puntos. Hay unt ema importante.
"cin>>" coge de la entrada caracteres hasta X punto. Si tú introduces "78456\n", va a leer el entero 78456 (en caso de que hagas "cin>>int" claro). El "\n" ese va a quedar en el buffer. Esto implica que la siguiente llamada a getline va a leer hasta el "\n", es decir, nada. Siquiera va a pedir entrada por teclado.

Visto el aspecto técnico, hay formas de arreglarlo:
[ul]
  • Colocar después de cada "cin>>" un cin.ignore() para que ignore el salto de línea. Si no te fuera, podrías poner "cin.ignore(2), para que ignore 2 caracteres (por si acaso, vaya)
  • No utilizar "cin>>". Sé que es práctico, pero este es un problema común. La opción, sería leer siempre con getline, y si necesitas interpretar un entero, podrías poner:
Código (cpp) [Seleccionar]
string t;
getline(cin, t); // Leemos el número. Ej: 542
int n = stoi(t); // Convertimos string a int

La función stoi: http://www.cplusplus.com/reference/string/stoi/
También tienes para convertir a float: stof

vojok

Muchisimas gracias ,me salvaste de romperme la cabeza con la mesa jeje ,llevaba rato con este tema y no encontraba con la solucion y era tan facil jeje, muchas gracias.