2017-07-03 3 views
0

Je dois faire une fonction qui chaque fois que je clique sur le bouton, le programme lit et agit selon une ligne dans le fichier log_p.txt. Cependant, si je mets le processus read t à l'intérieur de la fonction, il lira chaque fois la première ligne.Je dois utiliser getline() à chaque fois que la fonction est appelée. Comment éviter de répéter la lecture des mêmes lignes dans txt? C++

void ai_fight::getfile() 
{ 
    std::ifstream t("log_p.txt"); 

    ui->pushButton->setEnabled(false); 

    getline(t, rule); 

    print_rule(rule); 

    if(getline(t, p1hand)) print_p1hand(p1hand); 

    if(getline(t, p1p)) print_p1p(p1p); 

    if(getline(t, p2hand)) print_p2hand(p2hand); 

    if(getline(t, p2p)) print_p2p(p2p); 

    getline(t, announce); 
    if(announce=="1 eliminated"||announce=="0 eliminated") 
    { 
     getline(t, buf); 
     getline(t, buf); 
     getline(t, buf); 
     getline(t, buf); 
     getline(t, win); 
     print_win(win); 
     ui->pushButton->setEnabled(true); 
    } 
    else if(announce=="0 winning"||announce=="1 winning") 
    { 
     ui->pushButton->setEnabled(true); 
    } 
    else qDebug()<<"----------announcement error"<<endl; 
    ui->pushButton->setEnabled(true); 
} 
+1

"Cependant, si je mets le processus de lecture t à l'intérieur de la fonction, chaque fois qu'il lira la première ligne." Je ne comprends pas vraiment ce que vous voulez dire par là. La nature de 'std :: ifstream' après l'ouverture d'un fichier est de commencer à lire à partir du premier caractère du fichier. Est-ce que vous n'avez * pas * l'intention de le faire? – Aconcagua

+0

Y at-il une raison pour laquelle vous ne pouvez pas lire tout le fichier en mémoire? Quelque chose comme un vecteur de chaînes? –

Répondre

0

Le moyen le plus simple est probablement de stocker le ifstream en tant que membre de classe.

void ai_fight::getfile() 
{ 
    if (!m_t.is_open()) 
     m_t.open("log_p.txt"); 
    ... 

Vous voudrez probablement fermer le fichier lorsque vous atteignez EOF afin de pouvoir effectuer une boucle.

0

Chaque fois que vous ouvrez un fichier, il commence à le lire depuis le début. Ce dont vous avez besoin est de se souvenir de la position actuelle dans le fichier de manière persistante entre les appels de fonction. Vous pouvez y arriver (au moins) deux façons:

  1. Ouvrez le fichier en dehors de la fonction (par exemple en tant que membre de la classe). De cette façon, le fichier sera ouvert pendant toute l'exécution et l'objet ifstream se souviendra de la position actuelle.

  2. Enregistrez la position actuelle dans le fichier dans une variable. Vous pouvez utiliser les méthodes tellg et seekg pour obtenir et définir la position du curseur dans le flux de fichiers. Bien sûr, vous devez stocker cette valeur en dehors de la fonction.