c++ moyen le plus rapide pour lire uniquement la dernière ligne du fichier texte?
J'aimerais lu que la dernière ligne d'un fichier texte (je suis sur UNIX, peut utiliser Boost). Toutes les méthodes que je connais requièrent une analyse à travers l'ensemble du fichier afin d'obtenir la dernière ligne qui n'est pas efficace du tout. Est-il un moyen efficace pour obtenir uniquement la dernière ligne?
Aussi, j'ai besoin de cela pour être suffisamment robuste pour que cela fonctionne, même si le fichier texte en question est constamment ajouté par un autre processus.
Est-il tout est robuste dans le fait de quelqu'un constante modifier le fichier? Comment voulez-vous même de définir "robuste" dans cette circonstance?
vous devriez être en mesure d'obtenir à la fin et l'analyse en arrière pour un terminateur de ligne. Je serais probablement vous suggérons de ne pas utiliser un fichier raw ici, cependant, car il sonne plus comme vous voulez un tuyau.
vous devriez être en mesure d'obtenir à la fin et l'analyse en arrière pour un terminateur de ligne. Je serais probablement vous suggérons de ne pas utiliser un fichier raw ici, cependant, car il sonne plus comme vous voulez un tuyau.
OriginalL'auteur user788171 | 2012-08-09
Vous devez vous connecter pour publier un commentaire.
Utilisation seekg pour sauter à la fin du fichier, puis de le lire jusqu'à ce que vous trouver le premier retour à la ligne.
Ci-dessous est un exemple de code sur le dessus de ma tête à l'aide de MSVC.
Et ci-dessous est un fichier de test. Il réussit à vide, d'une ligne, et de plusieurs lignes de données dans le fichier texte.
Drôle, je l'ai testé avant de poster. Est-ce que votre test.txt une ligne vide à la fin?
Cela ne fonctionne pas pour moi, car les fichiers texte doit se terminer par un caractère de nouvelle ligne et de nombreux éditeurs insérer le caractère automatiquement.
OriginalL'auteur derpface
Sauter à la fin, et de commencer la lecture de blocs vers l'arrière jusqu'à ce que vous trouver quels que soient vos critères pour une ligne est. Si le dernier bloc n'a pas de "fin" avec une ligne, vous aurez probablement besoin d'essayer et d'analyse de l'avant (en supposant une très longue ligne dans un activement ajouté dans le fichier).
En utilisant quelque chose comme istream::seekg(0, ios_base::end). Vous pouvez ensuite utiliser seekg de là à aller de l'avant/vers l'arrière dans le flux.
OriginalL'auteur Will Hartung
Vous pouvez utiliser seekg() pour sauter à la fin du fichier, et lue à l'envers, le Pseudo-code comme:
seekg
peut-être?mon erreur,vous avez raison.
OriginalL'auteur carter2000
Au début cela a été conçu pour lire le dernier syslog entrée. Étant donné que le dernier caractère avant la EOF est
'\n'
nous cherchons en arrière pour trouver l'occurrence suivante de'\n'
et puis nous stockons la ligne dans une chaîne de caractères.OriginalL'auteur alexandros
Alors que la réponse par derpface est certainement correct, il revient souvent des résultats inattendus. La raison pour cela est que, au moins sur mon système d'exploitation (Mac OSX 10.9.5), de nombreux éditeurs de texte, mettre fin à leurs fichiers avec une "fin de ligne".
Par exemple, quand j'ouvre vim, tapez simplement le caractère " a " (pas de retour), et de l'enregistrer, le fichier contiendra maintenant (en hexadécimal):
61 est la lettre 'a' et 0A est un caractère de fin de ligne.
Cela signifie que le code par derpface renvoie une chaîne vide sur tous les fichiers créés par un éditeur de texte.
Bien que je ne peux certainement imaginer des cas où un fichier est arrêté avec une "fin de ligne" doit retourner une chaîne de caractères vide, je pense que ignorant la dernière "fin de ligne" serait plus approprié lorsque vous traitez avec des fichiers de texte normaux; si le fichier est terminée par une "fin de ligne" - nous bien de l'ignorer, et si le fichier n'est pas résilié par une "fin de ligne" nous n'avons pas besoin de le vérifier.
Mon code pour ignorer le dernier caractère du fichier d'entrée est:
Qui sera de sortie:
Sur le single "un".
EDIT: La ligne
if((int)fin.tellg() <= 0){
cause de problèmes si le fichier est trop gros (> 2 GO), car tellg n'est pas simplement renvoyer le nombre de caractères à partir du début du fichier (tellg() de la fonction de donner mauvaise taille de fichier?). Il peut être préférable d'séparément test pour le début du fichierfin.tellg()==tellgValueForStartOfFile
et pour les erreursfin.tellg()==-1
. LetellgValueForStartOfFile
est probablement 0, mais la meilleure façon de vous assurer que serait probablement:OriginalL'auteur Joost Huizinga
J'ai aussi été en difficulté sur le problème parce que j'ai couru uberwulu du code et a également obtenu de ligne vide.
Voici ce que j'ai trouvé. Je suis l'aide de la suite .fichier csv comme un exemple:
De comprendre les commandes dans le code, veuillez noter les endroits suivants et de leurs caractères. (Loc, char) : ... (63,'3') , (64,'5') , (65,-) , (66,'\n'), (EOF,-).
OriginalL'auteur Gary Yang
J'ai pris alexandros solution et amélioré un peu
OriginalL'auteur Daniel Duvilanski