• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nie moge przerwac petli

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
224 wizyt
pytanie zadane 3 czerwca 2017 w C i C++ przez QizmoPL Stary wyjadacz (11,440 p.)
void loginAccount()
{
	std::cout << "Konto istnieje. \n";
	std::fstream dataInfo;
	dataInfo.open("dataInfo.txt", std::ios::in);
	std::string loginFromFlie;

	while (true)
	{
        bool login = false; 
        bool password = false;

		std::cout << "Podaj login: ";
		std::string loginUser;
		std::cin >> loginUser;
		clearInputConsole();

		std::cout << "Podaj haslo: ";
		std::string passwordUser;
		std::cin >> passwordUser;
		clearInputConsole();

		int numberLine = 0;
		while (!dataInfo.eof())
		{
			if (!(numberLine % 4))
			{
				std::getline(dataInfo, loginFromFlie);
				if (loginFromFlie == loginUser)
				{
					login = true;
					std::cout << login;
					break;
				}
			}
			else
			{
				std::getline(dataInfo, loginFromFlie);
			}
			numberLine++;
		}

		numberLine = 0;
		while (!dataInfo.eof())
		{
			if (!(numberLine % 2))
			{
				std::getline(dataInfo, loginFromFlie);
				if (loginFromFlie == passwordUser)
				{
					password = true;
					std::cout << password;
					break;
				}
			}
			else
			{
				std::getline(dataInfo, loginFromFlie);
			}
			numberLine++;
		}

		if (login == true && password == true)
			break;
	}
	dataInfo.close();
}

 

Nie moge przerwac petli i wsumie nie wiem dlaczego. Uzytkownik podaje login i haslo, jezeli pasuja to koniec(ostatni if), jezeli zle wpisze to odnowa petla

 

komentarz 3 czerwca 2017 przez racmo Obywatel (1,320 p.)
Przydałaby się jeszcze informacja jak zapisujesz te dane w pliku.
komentarz 3 czerwca 2017 przez CzikaCarry Szeryf (75,480 p.)
Sprawdź w debuggerze które ify się wykonują, bo obstawiam, że gdzieś w warunku jest fail, ewentualnie coś złego się dzieje z odczytem danych z pliku.
komentarz 3 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)

racmo nie chodzi o sposob odczytu i zapisu, a o przerwanie petli. ogolnie dzial poprawnie jezeli podam poprawne dane, wtedy jest ok, ale jak zle to sie zapetla,  CzikaCarry sprawdzam przypisanie wartosci ogolnie zwraca 1 jezeli prawda i nic jezeli falsz

 

2 odpowiedzi

+1 głos
odpowiedź 3 czerwca 2017 przez Szahid Pasjonat (20,930 p.)
wybrane 3 czerwca 2017 przez QizmoPL
 
Najlepsza
Ta 26 linijka jest bez sensu. numberLine % 4 daje liczbe a nie wartość true albo false. W ogóle to ten pierwsze 2 ify są jakieś dziwne. Podaj plik txt. ( Nie pisz że chodzi o przerwanie pętli bo to przez zły odczyt nie przerywa )
komentarz 3 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
wszystko na githubie

https://github.com/MateuszMiekicki/Data-base-cpp-hotel/blob/master/sql/dataInfo.txt

troche jest tma syf wiec masz linka
komentarz 3 czerwca 2017 przez Szahid Pasjonat (20,930 p.)

Taki kod działa. Pętla się przerywa. Dlaczego napisałeś że nic się nie zmieniło ? Co wywala? 

Jeszcze raz wklejam kod

void loginAccount()
{
    std::cout << "Konto istnieje. \n";
    std::fstream dataInfo;
    dataInfo.open("dataInfo.txt", std::ios::in);
    if(!dataInfo.good())
    {
        cout<<"Nie otwarto pliku"<<endl;
        exit(0);
    }
    std::string loginFromFlie;

    while (true)
    {
        bool login = false;
        bool password = false;

        std::cout << "Podaj login: ";
        std::string loginUser;
        std::cin >> loginUser;
        cin.sync();
        cin.clear();

        std::cout << "Podaj haslo: ";
        std::string passwordUser;
        std::cin >> passwordUser;
        cin.clear();
        cin.sync();

        int numberLine = 0;
        while (!dataInfo.eof())
        {
            if (!(numberLine % 4))
            {
                std::getline(dataInfo, loginFromFlie);
                if (loginFromFlie == loginUser)
                {
                    login = true;
                    std::cout << login;
                    break;
                }
            }


            numberLine++;
        }
        dataInfo.clear();
        numberLine = 0;
        while (!dataInfo.eof())
        {
            if (!(numberLine % 2))
            {
                std::getline(dataInfo, loginFromFlie);
                if (loginFromFlie == passwordUser)
                {
                    password = true;
                    std::cout << login;
                    break;
                }
            }

            numberLine++;
        }

        if (login == true && password == true)
            break;
    }
    dataInfo.close();
}

 

komentarz 3 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
niewiem czemu, ale umienie nie dziala tak ja bym chcial, petla dobrze dziala jezeli podam login i haslo dobrze za pierwszym razem, potem sie zapetla, nawet po podaniu poprawnego loginu i hasla, nic sie nie zmienia
komentarz 3 czerwca 2017 przez Szahid Pasjonat (20,930 p.)

Fakt. U mnie też. Trzeba było przesunąć wskaźnik na początek pliku.

Teraz spróbuj taki kod. Powienien działać 

void loginAccount()
{
    std::cout << "Konto istnieje. \n";
    std::fstream dataInfo;
    dataInfo.open("dataInfo.txt", std::ios::in);
    if(!dataInfo.good())
    {
        cout<<"Nie otwarto pliku"<<endl;
        exit(0);
    }
    std::string loginFromFlie;

    while (true)
    {
        bool login = false;
        bool password = false;
        dataInfo.seekg(0);
        std::cout << "Podaj login: ";
        std::string loginUser;
        std::cin >> loginUser;
        cin.sync();
        cin.clear();

        std::cout << "Podaj haslo: ";
        std::string passwordUser;
        std::cin >> passwordUser;
        cin.clear();
        cin.sync();

        int numberLine = 0;
        while (!dataInfo.eof())
        {
            if (!(numberLine % 4))
            {
                std::getline(dataInfo, loginFromFlie);
                if (loginFromFlie == loginUser)
                {
                    login = true;
                    std::cout << login;
                    break;
                }
            }


            numberLine++;
        }
        dataInfo.clear();
        numberLine = 0;
        while (!dataInfo.eof())
        {
            if (!(numberLine % 2))
            {
                std::getline(dataInfo, loginFromFlie);
                if (loginFromFlie == passwordUser)
                {
                    password = true;
                    std::cout << login;
                    break;
                }
            }

            numberLine++;
        }
        dataInfo.clear();

        if (login == true && password == true)
            break;
    }
    dataInfo.close();
}

 

komentarz 3 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
dzieki
+2 głosów
odpowiedź 3 czerwca 2017 przez tangarr Mędrzec (150,800 p.)
Nie przewijasz pliku do początku przy każdej pętli.
komentarz 3 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
przewijam, numberLine=0
komentarz 3 czerwca 2017 przez tangarr Mędrzec (150,800 p.)
Nie przewijasz.
Przy pierwszej iteracji pętli czytasz cały plik, a przy następnych iteracjach próbujesz czytać plik od tego samego miejsca (tj. końca pliku).
Musisz wrócić do początku pliku. http://www.cplusplus.com/reference/istream/istream/seekg/
komentarz 3 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
przewijam, jak zrobie zeby wypisalo mi obecna linie to ja wypisuje
komentarz 3 czerwca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
faktycznie miales racje

Podobne pytania

+1 głos
3 odpowiedzi 96 wizyt
+1 głos
2 odpowiedzi 149 wizyt
pytanie zadane 7 marca 2021 w C i C++ przez Bulbi Początkujący (250 p.)
0 głosów
1 odpowiedź 680 wizyt

90,818 zapytań

139,493 odpowiedzi

313,553 komentarzy

60,311 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...