Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Rileggere lo stesso file
Forum - C/C++ - Rileggere lo stesso file

Avatar
Pierga (Normal User)
Newbie


Messaggi: 14
Iscritto: 14/04/2009

Segnala al moderatore
Postato alle 13:42
Mercoledì, 19/08/2009
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:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <fstream>
  4. #include <string>
  5. #include <windows.h>
  6. #include <ctime>
  7. using namespace std;
  8.  
  9. int main ()
  10. {
  11. int n=0;
  12. int righetot=0;
  13. int contalinee=0;
  14. int divisione;
  15. int result=0;
  16. int x=0;
  17. int num_casuale;
  18. int num_cas_prec=0;
  19. string line;
  20. cout<<"How many terms I have to ask you? ";
  21. cin>>n;
  22.  
  23. ifstream myfile;
  24. myfile.open ("My EN-ITA Vocabulary.txt", ios::out);
  25. if (myfile.is_open()) {
  26.    //conta le righe del file
  27.    while (! myfile.eof() ) {
  28.          getline (myfile,line);
  29.          righetot=righetot+1;
  30.          }
  31.          cout<<"righe totali= "<<righetot<<endl;
  32.          myfile.close();
  33.          }
  34.  
  35. for(int i=0; i < n; i++) {
  36.  
  37. //Genera un numero casuale sempre diverso
  38. srand((unsigned)time(NULL));
  39. num_casuale = rand() % righetot+1;
  40. while(num_casuale==num_cas_prec){
  41.                                 srand((unsigned)time(NULL));
  42.                                 num_casuale = rand() % righetot+1;
  43.                                }
  44. num_cas_prec=num_casuale;
  45. cout<<"num casuale: "<<num_casuale<<endl;
  46.  
  47. ifstream myfile2;
  48. size_t found;
  49. myfile2.open ("My EN-ITA Vocabulary.txt", ios::out);
  50. if (myfile2.is_open()) {  
  51.    while (! myfile2.eof() ) {
  52.          getline (myfile2,line);
  53.          contalinee=contalinee+1;
  54.          if (contalinee==num_casuale){
  55.             cout<<line<<endl;
  56.             found=line.find("=");
  57.             if (found!=string::npos) {
  58.                cout<<"  EN: "<<line.substr(0,found-1)<<endl;
  59.                char risp[200];
  60.                cout<<" ITA: ";
  61.                cin.getline(risp,200);
  62.                
  63.                if(x==0) {
  64.                        cin.getline(risp,200);
  65.                        x=x+1;
  66.                        }
  67.                if (line.substr(found+2).compare(risp) != 0){
  68.                   cout<<"                                                    Error..."<<endl;
  69.                   }
  70.                if (line.substr(found+2).compare(risp) == 0){
  71.                   cout<<"                                                    Good!!!"<<endl;
  72.                   result = result+1;
  73.                   }
  74.                   }
  75.          myfile2.close();
  76.          }
  77.          }
  78. }
  79.  
  80. else {
  81.       cout << "Unable to open file, check what you wrote!"<<endl;
  82.       }
  83. }
  84. cout<<endl;
  85. cout<<"End of file."<<endl;
  86. result=(result*10)/n;
  87. cout<<"Score: "<<result<<"/10"<<endl;
  88.  
  89. system("PAUSE");
  90. return 0;
  91. }



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 il 19/08/2009 alle 13:44
PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 16:21
Mercoledì, 19/08/2009
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...

PM Quote
Avatar
Pierga (Normal User)
Newbie


Messaggi: 14
Iscritto: 14/04/2009

Segnala al moderatore
Postato alle 18:37
Mercoledì, 19/08/2009
Perfetto!
Non so come ringraziarti, ho provato di tutto!
:hail::hail::hail:

PM Quote