Comment puis-je retourner un ifstream de revenir au début d'une ligne que l'on vient de lire en C++?
Après j'ai lu une ligne d'un fichier à l'aide de ifstream, est-il un moyen pour amener le flux de revenir au début de la ligne, je viens de lire, sous certaines conditions?
using namespace std;
//Some code here
ifstream ifs(filename);
string line;
while(ifs >> line)
{
//Some code here related to the line I just read
if(someCondition == true)
{
//Go back to the beginning of the line just read
}
//More code here
}
Donc si someCondition est vrai, la prochaine ligne de lire au cours de la prochaine pendant l'itération de boucle sera la même ligne, je viens de lire à l'instant. Sinon, la prochaine pendant l'itération de boucle va utiliser la ligne suivante dans le fichier. Si vous avez besoin de plus de précisions, veuillez ne pas hésiter à demander. Merci à l'avance!
Mise à JOUR #1
J'ai donc essayé le suivant:
while(ifs >> line)
{
//Some code here related to the line I just read
int place = ifs.tellg();
if(someCondition == true)
{
//Go back to the beginning of the line just read
ifs.seekg(place);
}
//More code here
}
Mais il ne lit pas de la même ligne de nouveau lorsque la condition est vraie. Est un entier acceptable tapez ici?
Mise à JOUR #2: La Solution
Il y avait une erreur dans ma logique. Voici la version corrigée qui fonctionne comme je le souhaite pour tout ceux qui sont curieux:
int place = 0;
while(ifs >> line)
{
//Some code here related to the line I just read
if(someCondition == true)
{
//Go back to the beginning of the line just read
ifs.seekg(place);
}
place = ifs.tellg();
//More code here
}
L'appel à tellg() a été déplacé à la fin parce que vous avez besoin de chercher le début de la ligne de lecture. La première fois j'ai appelé tellg() et puis il a appelé seekg() avant que le flux même changé, ce qui est pourquoi il semblait que rien n'a changé (car il n'avions pas vraiment). Merci à tous pour vos contributions.
Par la manière, de la fi >> string n'est pas prise en lignes, mais des mots. Utiliser std::getline
Merci au sujet getline. Il a causé des bugs gênants dans l'avenir.
OriginalL'auteur Kimberly W | 2012-10-15
Vous devez vous connecter pour publier un commentaire.
Il n'y a aucun moyen direct pour dire "revenir au début de la dernière ligne". Cependant, vous pouvez revenir à une position que vous avez gardé en utilisant
std::istream::tellg()
. C'est, avant de lire une ligne que vous souhaitez utilisertellg()
et puisseekg()
pour revenir à la position.Cependant, l'appel de la chercher fonctions fréquemment est assez cher, c'est à dire, je regarde la suppression de l'obligation de lire des lignes de nouveau.
J'ai besoin de lire des caractères à partir d'un disque dur 40 go de fichiers en fonction jusqu'à ce que je frappe un des caractères (caractères délimiteurs) que la fonction ne doit pas lire. Est l'aide de peek() moins cher ou tellg() seekg() pour marquer le caractère précédent poste, j'ai besoin de revenir? Je pense que le plus efficace serait de ne pas utiliser de tout cela et il suffit de retourner la lecture supplémentaire de caractère.
à l'aide de
peek()
est assez bon marché. Essentiellement, il nereturn this->gptr() != this->egptr()? *this->gptr(): this->underflow();
(correctement élargit lechar
dans unint
, tout de même). En supposant que le flux est mis en mémoire tampon c'est un pointeur conparison et un déréférencement. Unpeek()
appel fait beaucoup plus de travail.OriginalL'auteur Dietmar Kühl
Magasin fstream position dans le fichier (voir la documentation).
Ligne de lecture.
Si la condition se produit - aller à la position stockée dans le fichier.
Vous avez besoin de ceci:
http://en.cppreference.com/w/cpp/io/basic_istream/tellg
http://en.cppreference.com/w/cpp/io/basic_istream/seekg
OriginalL'auteur PiotrNycz