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

Nie moge przerwac petli

VPS Starter Arubacloud
0 głosów
344 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,340 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 (154,780 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 (154,780 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 147 wizyt
+1 głos
2 odpowiedzi 188 wizyt
pytanie zadane 7 marca 2021 w C i C++ przez Bulbi Początkujący (250 p.)
0 głosów
1 odpowiedź 903 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...