1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por Neojag, 4 de Março de 2007. (Respostas: 4; Visualizações: 2449)

  1. Neojag

    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: 4 de Março de 2007
  2. Neojag

    Neojag Power Member

    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
     
  3. Ragnarok

    Ragnarok Folding Member

    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.
     
  4. TuxBoss

    TuxBoss Power Member

    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.)
     
  5. Warrior

    Warrior Power Member

    Ou quando o tamanho do ficheiro for demasiado grande.. Logicamente não o vais ler para a memória nesse caso.
     

Partilhar esta Página