Getline solo lee primera linea [C++]

Iniciado por r4gnath0r, Abril 07, 2017, 09:48:46 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.


Estoy intentando leer un archivo .txt mediante C++, en el que el usuario introduce (en este caso un "usuario" y una "pass") dos datos, y que cuando los compare, si estan los dos, imprima por pantalla un tipo "Login correcto". El codigo es el siguiente:

Código: text
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int main(){
    ifstream archivo("user.txt");

    //Obtencion de datos
    cout << "Usuario: ";
    char user[25];
    cin.getline(user,25,'\n');

    cout << "Pass: ";
    char pass[25];
    cin.getline(pass,25,'\n');

    //Creacion de la linea a buscar
    char busqueda[100];
    strcpy(busqueda, user);
    strcat(busqueda, " ");
    strcat(busqueda, pass);

    char linea[100];
    while(!archivo.eof() || busqueda != linea){
        for(int i = 0; i!=archivo.eof(); i++){
            archivo.getline(linea, 100);
        }
    }

    cout << endl << endl << "LOGIN CORRECTO." << endl << linea;

    return 0;
}

El problema es que una vez que introduce los dos datos, se queda en un bucle infinito en el que no hace nada. Puedes estar dandole intro todo el rato que no sale de ahi...

Haciendo más pruebas, he llegado al siguiente codigo. Lo unico es que solo compara con la primera linea del archivo.

Código: text
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

struct registro{
    string name;
    string second;
    string street;
    string user;
    string pass;
} usuario;

void registroUsuario(){
    ofstream archivo("registro.txt");
    archivo << "----------------------" << endl;
    archivo << "Nombre: " << usuario.name << endl;
    archivo << "Apellido: " << usuario.second << endl;
    archivo << "Direccion: " << usuario.street << endl;
    archivo << "Usuario: " << usuario.user << endl;
    archivo << "Password: " << usuario.pass << endl;
    archivo.close();
}

void registroLogin(){
    ofstream archivo("usuarios.txt");
    archivo << usuario.user;
    archivo << " ";
    archivo << usuario.pass;
    archivo << "\n";
    archivo.close();
}

bool login(string usuario, string password){
    ifstream archivo("usuarios.txt");
    string busqueda = usuario + " " + password;
    string linea;
    while(!archivo.eof()){
        getline(archivo, linea);
        if(linea == busqueda){
            return true;
        }
        else{
            return false;
        }
    }
}

int main(){
    menu:
        cout << "\t\t\t *** Base de datos ***" << endl << endl;
        cout << "1. Registro de usuario" << endl;
        cout << "2. Login" << endl;
        cout << "0. Salir" << endl << endl;

        cout << "Escoge una opcion: ";
        int option;
        cin >> option;
        cin.ignore();
        cout << endl << endl;
        system("pause");

        switch(option){
            case 1:{
                system("cls");
                cout << "Nombre: ";
                getline(cin, usuario.name);
                cout << endl << "Apellido: ";
                getline(cin, usuario.second);
                cout << endl << "Direccion: ";
                getline(cin, usuario.street);
                cout << endl << endl << "Nombre de usuario: ";
                getline(cin, usuario.user);
                cout << endl << "Password: ";
                getline(cin, usuario.pass);

                registroUsuario();
                registroLogin();
                cout << endl << endl;
                system("pause");
                goto menu;
                break;
            }
            case 2:{
                system("cls");
                cout << "Usuario: ";
                getline(cin, usuario.user);
                cout << endl << "Password: ";
                getline(cin, usuario.pass);

                if(login(usuario.user, usuario.pass) == true){
                    goto login;
                }
                else{
                    cout << endl << endl << "Login incorrecto.";
                    goto menu;
                }
                break;
            }
        }
    login:
        cout << endl << endl << endl << "LOGIN CORRECTO";


    return 0;
}

 
Código: c
while(!archivo.eof() || busqueda != linea){
        for(int i = 0; i!=archivo.eof(); i++){
            archivo.getline(linea, 100);
        }
    }


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    eof Check whether eofbit is set
         Verifica si eof bit esta prendido

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
En el while:
                 checkear el ifstream esta bien sin embargo busqueda != linea estas comparando 2 punteros deberías usar algo que compare cadenas =).
    En el for:
                  i!=archivo.eof() i es un indexador que empieza en 0 pero como el archivo no ha leído nada ,supongo que tiene, no ha llegado a eof luego archivo.eof() devolverá 0 por lo tanto i != archivo.eof() es FALSE y no entra en el bucle... una sugerencia: Saca el for O el while.

No he entendido muy bien la respuesta.

La idea era que mientras el archivo no haya llegado al final, siga leyendo líneas, pero como digo solo coge la primera.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No he entendido muy bien la respuesta.
Voy a suponer que lo que no entiendes es "que" te he pedido que corrijas.
Punteros y Cadenas de caracteres(strings)
Los punteros son una dirección de memoria(tamaño dependiente del S.O). Los arreglos son un "conjunto de espacios de memoria ordenados(DEFINICION PROBABLEMENTE MAL).Una cadena de caracteres en C es un arreglo, también llamado vector, de caracteres que para indicar su fin se usa el valor '\x00', es decir el ultimo elemento de ese arreglo es un 0. Cuando tu declaras una cadena de caracteres de la siguiente forma char cadena[32]; la variable cadena ,así sin corchetes,  apunta al valor del comienzo de la cadena. Si no me crees prueba este codigo:
Código: c

#include <stdio.h>
int main()
{
    char cadena[]="jejeje",asd[]="jejeje";
   
    printf("%p %p\n",cadena,asd);
    if(cadena!=asd)
    {
         printf("cadena y asd son distintos\n");
    }else if(cadena==asd)
    {
         printf("cadena y asd son iguales y Erroneo0 estaba erroneo\n");
    }
    return 0;
}

El programa hace lo que tu le has dicho, no lo que TU has pensado que le has dicho.