Oppure

Loading
19/08/09 11:42
Pierga
Sto creando un giochetto per aiutarmi a memorizzare nuovi vocaboli di inglese (e per imparare qualcosa di più su C++). Col tempo ho creato un vocabolario "My EN-ITA Vocabulary.txt" in cui i vari vocaboli sono scritti come:
xxx xxxxx = yy yyyyyy
Quello che vorrei fare é: far si che il programma generi un numero a caso, si posizioni sulla riga del vocabolario corrispondente a tale numero e me la chieda.
Questo è quello che ho fatto:
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string>
#include <windows.h>
#include <ctime>
using namespace std;

int main ()
{
int n=0;
int righetot=0;
int contalinee=0;
int divisione;
int result=0;
int x=0;
int num_casuale;
int num_cas_prec=0;
string line;
cout<<"How many terms I have to ask you? ";
cin>>n;

ifstream myfile;
myfile.open ("My EN-ITA Vocabulary.txt", ios::out);
if (myfile.is_open()) {
   //conta le righe del file
   while (! myfile.eof() ) {
         getline (myfile,line);
         righetot=righetot+1;
         }
         cout<<"righe totali= "<<righetot<<endl;
         myfile.close();
         }

for(int i=0; i < n; i++) {

//Genera un numero casuale sempre diverso
srand((unsigned)time(NULL));
num_casuale = rand() % righetot+1;
while(num_casuale==num_cas_prec){
                                srand((unsigned)time(NULL));
                                num_casuale = rand() % righetot+1;
                               }
num_cas_prec=num_casuale;
cout<<"num casuale: "<<num_casuale<<endl;

ifstream myfile2;
size_t found;
myfile2.open ("My EN-ITA Vocabulary.txt", ios::out);
if (myfile2.is_open()) {   
   while (! myfile2.eof() ) {
         getline (myfile2,line);
         contalinee=contalinee+1;
         if (contalinee==num_casuale){
            cout<<line<<endl;
            found=line.find("=");
            if (found!=string::npos) {
               cout<<"  EN: "<<line.substr(0,found-1)<<endl;
               char risp[200];
               cout<<" ITA: ";
               cin.getline(risp,200);
               
               if(x==0) {
                       cin.getline(risp,200);
                       x=x+1;
                       }
               if (line.substr(found+2).compare(risp) != 0){
                  cout<<"                                                    Error..."<<endl;
                  }
               if (line.substr(found+2).compare(risp) == 0){
                  cout<<"                                                    Good!!!"<<endl;
                  result = result+1;
                  }
                  }
         myfile2.close();
         }
         }
}

else {
      cout << "Unable to open file, check what you wrote!"<<endl;
      }
}
cout<<endl;
cout<<"End of file."<<endl;
result=(result*10)/n;
cout<<"Score: "<<result<<"/10"<<endl;

system("PAUSE");
return 0;
}


Il problema è che inizia a leggere dal numero a caso e va solo verso la fine del file vocabolario. Se il generatore casuale dà un numero minore del precedente si blocca, mentre ad ogni domanda dovrebbe ripartire a leggere il vocabolario dall'inizio.
Spero di essere stato chiaro, grazie a chiunque mi illummini la via! :idea: :heehee:
Ultima modifica effettuata da Pierga 19/08/09 11:44
aaa
19/08/09 14:21
Premoli
ciao!!!
se ho capito bene il problema, allora una possibile soluzione potrebbe essere la funzione rewind();
questo è il prototipo
void rewind(FILE *stream);
in pratica questa funzione imposta l'indicatore di posizione del file puntato da stream all'inizio file...

spero di esserti stato utile...
aaa
19/08/09 16:37
Pierga
Perfetto!
Non so come ringraziarti, ho provato di tutto!
:hail::hail::hail:
aaa