2017-09-28 8 views
0

J'essaye de modéliser une telle situation: mon programme vient de lire la dernière ligne de std :: ifstream (par exemple, pour le fichier texte "data.txt") et fait quelques opérations cela peut prendre beaucoup de temps, donc quelqu'un peut ajouter des lignes supplémentaires au fichier texte. Mon code iciEssayer de rendre std :: ifstream à nouveau ouvert

while (std::getline(fs, str)) // fs is of std::ifstream type, str is std::string 
     { 
      //main code 

      ifs.clear(); // (1) 
      ifs.setstate(std::ios_base::goodbit); // (2) 
     } 

J'ai un point d'arrêt sur tout ... en ligne et essayer d'ajouter de nouvelles lignes à Data.txt après avoir lu la dernière ligne à partir de là. Mon premier essai a échoué. J'ai essayé d'ajouter (1), (2) ou leur combinaison à mon code afin de rendre eofbit = false, mais j'ai échoué à nouveau. Quoi d'autre peut aider?

+0

vous voulez lire un fichier pendant que quelqu'un d'autre l'écrit? – user463035818

+0

Oui, c'est ça. Plus précisément, il est possible que quelqu'un ait ajouté des lignes dans un fichier au moment où mon programme faisait la section '// code principal', mais il est peu probable que nous utilisions data.txt en même temps. –

Répondre

0

Vous l'ajoutez au mauvais endroit. EOF est rencontré dans l'instruction conditionnelle while, vous ne pouvez pas l'empêcher et vous ne pouvez pas le corriger dans la boucle.

La réponse est de mettre la boucle de lecture dans une autre boucle:

while (...) 
{ 
    fs.clear(); 
    std::string str; 
    while (getline(fs, str)) 
    { 
    ... 
    } 
} 

Voici le kicker: votre programme sera constamment spamming le fichier avec une EOF tentative de lecture, ce qui est très CPU convivial. Vous devriez mettre quelque chose dans votre état supérieur de déclaration pour modérer cela.

  • dormir simplement un peu court (comme un quart de seconde)
  • Wait sur la mise à jour du fichier

Les deux nécessitent un code spécifique à l'OS. Ce dernier est préféré.
Here’s a little library on GitHub that covers all the bases.

+0

peut-être utile d'ajouter que la lecture d'un fichier alors qu'il est écrit sans mécanisme de synchronisation n'est pas une très bonne idée en premier lieu – user463035818

+0

Vrai, mais la mise en mémoire tampon est un comportement standard et fournit généralement suffisamment de points de synchronisation. Les autres problèmes que vous pouvez rencontrer concernent le verrouillage de fichier ... –