Permalänk
Medlem

C++ läsa från txt: problem

class Random { public: int show(int p) { srand( ( unsigned )time( 0 ) ); int random_integer; random_integer = ( rand ( ) % p ) + 1; return random_integer; } }; int word() { std::ifstream read ("example.txt"); std::string line; std::vector < std::string > stuff; int counter = 0; while (getline(read, line, '\n')) { if(line.size()!=0) { stuff.push_back( line ); counter++; } } read.close(); Random a; zeword=stuff[a.show( counter - 1 )]; return 0; }

Detta läser alltså in ett "random" ord till den globala stringen: zeword

det enda problemet är att programet hänger sig om txt filen innehåller mindre än 2 ord.
så om någon ser varför, skriv gärna!

Visa signatur
Permalänk
Medlem

Om du bara har ett ord i filen kommer show returnera 1, vilket är out of bounds.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Du borde också köra srand i en konstruktor av klassen Random eller ev en initmetod om du inte vill kalla den från main då man inte ska köra den mer än en gång, nu körs den varje gång du kallar show vilket kan ge oslumpmässiga resultat om du använder funktionen fler gånger.

Permalänk
Medlem

tack grabbar!
inte så high på klasser så skippar konstruktor srand.
här har ni hela spelet(hängagubbe) om någon är intresserad.

#include <iostream> #include <string> #include <fstream> #include <sstream> #include <vector> #include <cstdlib> #include <ctime> std::string zeword; void play(); void addword(); int word(); int main () { while(true) { int choice=0; std::cout << "/////////////////////////////\n"; std::cout << "/ Input: 1 to add a word /\n"; std::cout << "/////////////////////////////\n"; std::cout << "/ Input: 2 to play \n"; std::cout << "/////////////////////////////\n"; std::cout << "/ Input: 3 to quit /\n"; std::cout << "/////////////////////////////\n\n"; std::cin >> choice; if(choice==1) { addword(); } if(choice==2) { word(); play(); } if(choice==3) { return 0; } } return 0; } void addword() { std::ofstream myfile ("example.txt", std::ios::app); int counter = 0; std::vector<std::string> numbersinwords(11); numbersinwords[1]="First",numbersinwords[2]="Second",numbersinwords[3]="Third", numbersinwords[4]="Fourth",numbersinwords[5]="Fifth",numbersinwords[6]="Sixth", numbersinwords[7]="Seventh",numbersinwords[8]="Eighth",numbersinwords[9]="Ninth", numbersinwords[10]="Tenth"; std::vector<std::string> words(11); std::vector<int>::size_type i=0; std::cout << "/////////////////////////////////////////////////////\n"; std::cout << "/ How many words would you like to add to the list? /\n"; std::cout << "/////////////////////////////////////////////////////\n"; std::cin >> counter; if (myfile.is_open()&& counter>0) { for (i = 0; (int)i <= counter; i++) { std::cout << "Enter your "<<numbersinwords[i]<<" word: "; getline (std::cin, words[i]); myfile << words[i] << "\n"; } myfile.close(); } else { std::cout << "Unable to open file"; } } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// void play() { std::cout << "the word is: "<< zeword.length() << " characters long"<< std::endl; std::cout << "how many guesses would u like to have?"<< std::endl; int guess_amount=0; std::cin >> guess_amount; std::vector<char> guessed_char; std::vector<char> vec_list; for(int i=0; (int)zeword.length()>i; i++) { vec_list.push_back('_'); } bool play=true; char guess_char=0; char last_guessed_char=guess_char; int pos=0; while (play==true && guess_amount !=0) { std::cout<<"you have "<<guess_amount<<" guesses left"; std::cout<<"\nenter your guess:"; std::cin>>guess_char; std::cout<<"\n\n"; for(int i=0; (int)zeword.length()>i; i++) { if(zeword[i] == guess_char) { vec_list[i]=guess_char; } std::cout<<vec_list[i]; } std::cout<<"\n\n\n\n\n\n\n\n"; if(zeword.find(guess_char) !=-1) { guess_amount--; std::cout<<"\nU found the letter '"<<guess_char<<"' in the word! \n"; guessed_char.push_back(guess_char); std::cout<<"the letters u have guessed on is: "; for(int i=0; (int)guessed_char.size()>i; i++) { std::cout<<guessed_char[i]<<", "; } std::cout<<std::endl; } else { guess_amount--; guessed_char.push_back(guess_char); std::cout<<"the letters u have guessed on is: "; for(int i=0; (int)guessed_char.size()>i; i++) { std::cout<<guessed_char[i]<<", "; } std::cout<<std::endl; } int counter =0; for(int i=0; (int)zeword.length()>i; i++) { if(zeword[i]==vec_list[i]) { counter++; } if(counter==zeword.length()) { std::cout<<"u win! \n\n"; play=false; } else if(guess_amount == 0) { std::cout<<"u lose! \n\n"; play=false; } } } } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// class Random { public: int show(int p) { srand( ( unsigned )time( 0 ) ); int random_integer; random_integer = ( rand ( ) % p ); return random_integer; } }; int word() { std::ifstream read ("example.txt"); std::string line; std::vector < std::string > stuff; int counter = 0; while (getline(read, line, '\n')) { if(line.size()!=0) { stuff.push_back( line ); counter++; } } read.close(); Random a; if(counter==1) { zeword=stuff[0]; } else { zeword=stuff[a.show(counter)]; } return 0; }

Visa signatur