Losowanie hasła

0

Witam, chciałbym zrobić program, który wczyta mi z pliku jedno losowe hasło i wyświetli je na ekranie, nie mam zielonego pojęcia jak to zrobić. Utknąłem na etapie wypisywania wszystkie z pliku i nie mogę użyć funkcji rand() bo mój string nie jest int`em a nawet jeśli bym go użył konwertując mojego stringa poprzez funkcję atoi to mój string jest całym plikiem a nie tylko jednym zdaniem...
[PATRZ ZAŁĄCZNIK]

xdadsada.png

2

Najprościej byłoby za każdym getline zwiększać sobie jakiś licznik i jeśli osiągnie on zadaną wartość (oznaczającą numer linii którą chcemy wypisać), to wypisujemy hasło.

1

Co ma rand do stringa niebędącego intem?!

Tak btw: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

W przypadku większej liczby haseł rób tak jak @pingwindyktator napisał, jak jest ich mało i są małe to trywialniej będzie wczytać wszystkie do wektora i wybrać losowy indeks.

0
	while(getline(plik,lines))
	{
					
		{
		cout << lines<< endl;
		}
	
		cout << nr_linii++ << endl;
	}

Mam licznik, tylko jak go teraz wywołać do rand`a?

0

Losujesz sobie pierw numer linii, a potem wyświetlasz linię, której numer jest zgodny z wylosowanym.

2

raczej najpierw powinien policzyć liczbę linii, więc najlepiej jak wczyta wszystko do std::vector.

0
#include <iostream>
#include <time.h>
#include <fstream>
#include <cstdlib>


using namespace std;

int main()
{
	fstream plik;
	string lines;
	int nr_linii=1;

	plik.open("hasla.txt",ios::in);
	
	
	srand(time(NULL));

	
	while(getline(plik,lines))
	{
		nr_linii = rand() %5 +1;
		if(nr_linii==lines)			
		{
		cout << lines<< endl;
		}
	
	}
		
	
	plik.close();
	
	return 0;
}

Zrobiłem to w ten sposób, ale mój if nie działa.

0

Działa, tylko bez sensu losujesz numer za każdym razem, zamiast zrobić to raz. Ponadto, zgodnie z uwagą @MarekR22, jeśli nie znasz liczby linii to musisz pierw ją i tak poznać.

0
#include <iostream>
#include <time.h>
#include <fstream>
#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
	fstream plik;
	string lines;
	vector <int> nr_linii;

	plik.open("hasla.txt",ios::in);
	
	
	srand(time(NULL));
	
	nr_linii = rand() %5 +1;
	
	while(getline(plik,lines))
	{
		nr_linii.push_back(++);
		
		if(nr_linii==lines)		
		{
		cout << lines<< endl;
		}
	
	}
		
	
	plik.close();
	
	return 0;
}

Zrobiłem to tak jak zrozumiałem, ale to kompletnie nie działa.

0

Masz zrobić wektor wczytanych stringów, a nie intów, wylosować jakiś indeks, i go wyświetlić.

nr_linii.push_back(++);

???

0

Super, ze ktoś mi powie: zrób to używając tego i tego, jak ja nawet nie wiem jaka jest w tym logika, wiem, ze da się to zrobić bez używania vektorów, ale nie wiem jak i o to pytam. Nie umiem vektorów i pewnie żeby się ich nauczyć musiał bym je implementować do kilku programów, ale jak tego nie robiłem, to mam po omacku dawać tutaj?

1

Mam policzyć potęgę, ale wszyscy każą mi tu używać mnożenia. Nie umiem mnożenia, a umiem dodawanie i wiem, że potęgę można obliczyć za pomocą dodawania i o to pytam.

Logika jest prosta. Wczytujesz linie jako stringi do tablicy (wektora). Losujesz sobie numerek. Wypisujesz string na wylosowanej pozycji.

0
#include <iostream>
#include <time.h>
#include <fstream>
#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
	fstream plik;
	string lines;
	int nr_linii = 1;
	int liczba;

	plik.open("hasla.txt",ios::in);
	
	
	srand(time(NULL));
	
	liczba = rand() %5 +1;
	
	while(getline(plik,lines))
	{
		nr_linii++;
		
		if(atoi(lines.c_str())==nr_linii)		
		{
		cout << lines<< endl;
		}
	
	}
		
	
	plik.close();
	
	return 0;
}

Nawet jezeli wylosuje losową liczbe i przyrównam ją do nr linii to mi to nic nie daje, bo nawet jesli cout wyswietli lines to lines to jest CALY plik, wiec ja nawet nie wiem po co ja mam liczyc nr linii skoro lines to jest string ktory jest niezmienny, wiec nie wazne co napisze on zawsze bedzie = np. 100. Więc ja totalnie nie rozumiem jak mam to zrobić, jezeli zapisze lines do vectora czyli do tablicy to i tak to będzie 100 np. to jak ja mam ze 100 wyświetlić 10 skoro to jest po prostu 100? XD No taka jest moja logika.

1

lines to jest każda linia w tym pliku, a nie cały plik.

       if(atoi(lines.c_str())==nr_linii)     

Gdzie tu wylosowana liczba? Jaki sens ma zamiana stringów, które nie są liczbami na liczby?

0
#include <iostream>
#include <time.h>
#include <fstream>
#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
	fstream plik;
	string lines;
	int nr_linii = 1;
	int liczba;

	plik.open("hasla.txt",ios::in);
	
	
	srand(time(NULL));
	
	liczba = rand() %4 +1;
	
	while(getline(plik,lines))
	{
		nr_linii++;
		
		if(liczba==nr_linii)		
		{
		cout << lines << endl;
		}
	
	}
		
	
	plik.close();
	
	return 0;
}

Działa! Nareszcie xD.

1

Przeanalizuj flow programu. Jak wylosujesz 1 to nigdy nic nie wyświetlisz, bo nr_linii zaczyna od wartości 1 i od razu ją zwiększasz w pętli przed sprawdzeniem.

0

Działa juz, ale jezu jak mi to 6h zajeło dojście do tego i to jeszcze z forum, to chyba nie zostane c++ developerem... ;/

2

@romulanik: z innej beczki – musisz korzystać ze zwykłego pliku tekstowgo? Bo jeśli nie, to mógłbyś trzymać hasła w prostym pliku binarnym, składającym się z np. 16-bajtowych bloczków, gdzie każdy bloczek to jedno hasło.

Dzięki temu nie musiałbyś ładować danych linia po linii, aż dokopiesz się do odpowiedniego ciągu. Wystarczyłoby wylosować indeks hasła, przemnożyć go przez rozmiar bloczka (przykładowo przez 16), przesunąć wskaźnik w strumieniu na ten bajt i wczytać bloczek. Liczba znajdujących się w pliku haseł też byłaby z góry znana – to rozmiar pliku w bajtach dzielony przez rozmiar bloczka.

1
romulanik napisał(a):

Działa juz, ale jezu jak mi to 6h zajeło dojście do tego i to jeszcze z forum, to chyba nie zostane c++ developerem... ;/

A co do tego ma C++?
Żaden z twoich problemów nie był typowy dla C lub C++. To samo miałbyś w każdym innym języku programowania.
Po prostu nie masz wyćwiczonego myślenia abstrakcyjnego (ćwiczonego podczas lekcji matematyki/fizyki/chemii) i musisz sobie to teraz nadrobić.
Pisanie programów nie różni się wiele od przestawienia zadania z matmy w postaci jakiegoś równania (problem opisany językiem naturalny trzeba opisać językiem abstrakcyjnym: jak wzór matematyczny, lub kodem C++).

Do tego posoliłeś to jeszcze przekonaniem, że zrobisz to idąc na skróty, nie rozumiejąc co masz zrobić i co masz do dyspozycji.

0
furious programming napisał(a):

@romulanik: z innej beczki – musisz korzystać ze zwykłego pliku tekstowgo? Bo jeśli nie, to mógłbyś trzymać hasła w prostym pliku binarnym, składającym się z np. 16-bajtowych bloczków, gdzie każdy bloczek to jedno hasło.

Dzięki temu nie musiałbyś ładować danych linia po linii, aż dokopiesz się do odpowiedniego ciągu. Wystarczyłoby wylosować indeks hasła, przemnożyć go przez rozmiar bloczka (przykładowo przez 16), przesunąć wskaźnik w strumieniu na ten bajt i wczytać bloczek. Liczba znajdujących się w pliku haseł też byłaby z góry znana – to rozmiar pliku w bajtach dzielony przez rozmiar bloczka.

Tak, bo robiłem to zadanie zeby ogarnąć fstream. ;p

0

Ale to nie zmienia faktu, że możesz skorzystać z fstream również do manipulacji plikami binarnymi – zobacz. W razie czego propozycja pozostanie jako zadanie dodatkowe, dla chcących. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1