[C++] Losowe wybieranie danego wyrazu z pliku


(Pawel Pieczyrak) #1

Cześć. Nie wiem jak to przelać na język programowania.

Mam plik o nazwie a.txt i jest w nim 10 słówek i chcę, aby za każdym uruchomieniem programu aplikacja pobierała z tego pliku inne, losowo wybrane słówko.

Z góry dziękuje za pomoc.


(Sawyer47) #2

Losowanie liczby z zakresu 0 .. 9 i wybranie słówka odpowiadającemu numerowi?


(Copycona) #3

A jak te 10 słówek jest ułożonych? Jedno słowo na linie? Jeżeli tak, to proponuję następujące rozwiązanie:

  1. Otwierasz plik, oczywiście w trybie do odczytu.

  2. Przesuwasz wskaźnik pozycji w losowe miejsce (pomiędzy 0, a wielkość pliku)

  3. Czytasz po jednym znaku, aż do napotkaniu znaku nowej linii (czyli "\n"), lub końca pliku.

4a. Jeżeli znalazło koniec pliku przerywasz, wracasz znowu do punktu drugiego.

  1. W momencie, gdy znalazł się znak nowej linii, zaczynasz zapisywać kolejne znaki do bufora, aż do momentu, gdy linia (lub plik) się skończy. To będzie Twoje losowe słowo.

5a. Jeżeli okazało by się, że linia była pusta, albo napotkany w punkcie 3. znak nowej linii stanowił ostatni jednocześnie znak w pliku przerywasz, wracasz znowu do punktu drugiego.

  1. Bufor do którego były zapisywane znaki zawiera losową linię (słowo) z pliku.

Więc jak widzisz nie musisz odczytywać całego pliku i dopiero wtedy losować. Taki sposób sprawdzi się dla dowolnie dużego pliku.

edit: Jeżeli słowa oddziela co innego, niż znak nowej linii, na przykład spacja, tabulator, przecinek, cokolwiek innego sprawa wygląda prawie tak samo. W punkcie nr 3 i nr 4 oczywiście "znak kluczowy", który zaznacza początek i koniec odczytu się zmienia. I to tyle.

Zobacz: http://werxltd.com/wp/2010/10/29/reading-random-lines-from-a-file-with-php/

Co prawda znajdziesz tam kod dla php, ale sam algorytm jest dobry.

Miałem pod ręką, bo ostatnio potrzebowałem losowe słowo ze słownika języka polskiego.

edit: Dla C/C++ też się znajdzie tego opis: http://stackoverflow.com/questions/2322 ... le-using-c


(system) #4

Samo losowanie to nie jest jakiś tam problem. Najprościej by było wszystko wrzucić do wektora i wylosować liczby z danego przedziału

...

unsigned int i = 0;

vector v;

ifstream in("Plik.txt");

string t;

while(in >> t){

    v.push_back(t);

    ++i;

}

Jeżeli po ponownym uruchomieniu programu miałby losować inne słowo to tutaj można by to było zrobić poprzez utworzenie nowego pliku, który zawierałby indeks wektora, jaki został już wykorzystany i ten plik powinien być "czyszczony" na nowo, gdyby została wykorzystana zawartość.