Retornar ao início da stream (C++)

Neojag

Power Member
Estou a ler linhas de um ficheiro de texto, e quando o programa encontra uma determinada linha, retorna a linha seguinte. O problema é que depois preciso de voltar ao início da stream e voltar a fazer o scan todo mas não consigo fazê-lo, assim que ele encontra o EOF nunca mais retorna nada. Ou seja, ele responde à primeira questão, mas a segunda se estiver mais abaixo na lista já não retorna nada. Tentei usar origem.clear() e abrir e fechar o ficheiro, mas nenhuma delas resultou. Alguém me pode elucidar sobre o que está mal com este algoritmo?
Obrigado

Código:
    while (x==0){
          
          getline(cin, pergunta);
          origem.clear();
    
          while(!origem.eof()){
                               getline(origem,temp);
                               
                               if (temp==pergunta){
                                  getline(origem,resposta);
                                  cout << resposta << endl;
                                  encontrada = true;
                                  break;
                                  }
                               
                               }
          if (encontrada == false) cout << "Pergunta outra coisa ó Nabo!\n"; 
          
          }

O ficheiro de texto contém:

Who are you?
I am the knight who says NI!
Where are you going?
Not to Camelot... It is a silly place!
Are you the messiah?
Yes, I'm the messiah. NOW **** OFF

Edit: descobri agora uma coisa, ele só deixa de retornar respostas em duas situações: se "pergunta" for a última pergunta da lista ou se for uma qualquer coisa que não lá esteja.
 
Última edição:
Entretanto resolvi o problema lendo primeiro o ficheiro todo para um array de strings e pesquisando no vector em vez de no ficheiro. Qual é o processo é mais vantajoso, ler do ficheiro em cada pesquisa ou lê-lo todo inicialmente?

Continuo curisoso a respeito da primeira pergunta tho :P
 
Lês o ficheiro todo e copias para estruturas de dados, não faz sentido estar a aceder ao ficheiro de cada vez que queres ler alguma coisa pois essa leitura é mais lenta. Por isso, não sei se será possível fazer o que pretendias no primeiro post.
 
Podes utilizar o fseek (que creio que também existe em C++) para mudares o pointer do offset para o inicio do ficheiro outra vez.
Mas de qualquer maneira a maneira correcta é mesmo ler tudo uma só vez e passar para uma estrutura de dados. (isto claro se o objectivo for multiplas operações sobre os dados do ficheiro, se for uma única operação não vale a pena.)
 
Back
Topo