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]
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.
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.
while(getline(plik,lines))
{
{
cout << lines<< endl;
}
cout << nr_linii++ << endl;
}
Mam licznik, tylko jak go teraz wywołać do rand`a?
Losujesz sobie pierw numer linii, a potem wyświetlasz linię, której numer jest zgodny z wylosowanym.
raczej najpierw powinien policzyć liczbę linii, więc najlepiej jak wczyta wszystko do std::vector
.
#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.
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ć.
#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.
Masz zrobić wektor wczytanych stringów, a nie intów, wylosować jakiś indeks, i go wyświetlić.
nr_linii.push_back(++);
???