lire les n dernières lignes du fichier en c / c ++
J'ai vu beaucoup de messages, mais ne trouve pas quelque chose que je veux.
Je suis mauvaise sortie :
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ...... //may be this is EOF character
Entrer dans une boucle infinie.
Mon algorithme:
- Aller à la fin du fichier.
- diminution de la position du pointeur par 1 et lire caractère par
caractère. - quitter si nous avons trouvé notre 10 lignes ou nous arrivons en début de fichier.
- maintenant, je vais scanner le fichier complet jusqu'expressions du FOLKLORE et de les imprimer //pas mis en œuvre dans le code.
code:
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main()
{
FILE *f1=fopen("input.txt","r");
FILE *f2=fopen("output.txt","w");
int i,j,pos;
int count=0;
char ch;
int begin=ftell(f1);
//GO TO END OF FILE
fseek(f1,0,SEEK_END);
int end = ftell(f1);
pos=ftell(f1);
while(count<10)
{
pos=ftell(f1);
//FILE IS LESS THAN 10 LINES
if(pos<begin)
break;
ch=fgetc(f1);
if(ch=='\n')
count++;
fputc(ch,f2);
fseek(f1,pos-1,end);
}
return 0;
}
UPD 1:
code modifié: il a juste 1 erreur - si l'entrée a des lignes comme
3enil
2enil
1enil
it prints 10 lines only
line1
line2
line3ÿine1
line2
line3ÿine1
line2
line3ÿine1
line2
line3ÿine1
line2
PS:
1. travail sur windows dans notepad++
- ce n'est pas de devoirs
- aussi je veux le faire sans l'aide de plus de la mémoire ou de l'utilisation de la STL.
- je pratique afin d'améliorer mes connaissances de base donc merci de ne pas poster sur toutes les fonctions (comme la queue -5 tc.)
s'il vous plaît aider à améliorer mon code.
source d'informationauteur Aseem Goyal | 2013-07-26
Vous devez vous connecter pour publier un commentaire.
Il y a un certain nombre de problèmes avec votre code. La plupart des
importante est que vous n'avez jamais vérifier que toutes les fonctions
réussi. Et enregistrer les résultats d'une
ftell
dans unint
n'est-ce pasune très bonne idée non plus. Puis il y a le test
pos < begin
;cela peut se produire uniquement si il y a une erreur. Et le fait que
vous êtes de mettre les résultats de
fgetc
dans unchar
(qui se traduitune perte d'information). Et le fait que le premier de vous lire
n'est à la fin du fichier, ce sera un échec (et une fois un ruisseau entre
un état d'erreur, il y reste). Et le fait que vous ne pouvez pas
fiable de faire de l'arithmétique sur les valeurs retournées par
ftell
(à l'exception desous Unix) si le fichier est ouvert en mode texte.
Oh, et il n'y a pas de "caractère EOF";
'ÿ'
est parfaitement validecaractère (0xFF en Latin-1). Une fois que vous affectez la valeur de retour
de
fgetc
à unchar
, vous avez perdu toute possibilité de tester pourà la fin du fichier.
Je pourrais ajouter que la lecture en arrière d'un caractère est
extrêmement inefficace. La solution habituelle serait d'allouer
une mémoire tampon suffisamment grande, puis de compter le
'\n'
.EDIT:
Juste un petit peu de code pour donner l'idée:
C'est un peu faible dans la gestion des erreurs; en particulier, vous
voulez probablement la distinction entre l'incapacité d'ouvrir des
un fichier et toutes les autres erreurs. (Pas d'autres erreurs devrait se produire,
mais on ne sait jamais.)
Aussi, c'est purement Windows, et elle suppose que le réel
le fichier contient du texte pur, et ne contiennent pas de
'\r'
quene font pas partie d'un CRLF. (Pour Unix, il suffit de déposer le côté de la
dernière ligne).
Commentaires dans le code
Cela est fait en utilisant le tableau circulaire de manière très efficace .
Pas de tampon supplémentaire est nécessaire .
Veuillez fournir des commentaires
cela vous indique le dernier point au dossier, de sorte que les expressions du FOLKLORE.
Quand vous lisez, vous obtenez les expressions du FOLKLORE d'erreur, et le ppointer veut aller de 1 espace de l'avant...
Donc, je vous conseille la diminution de la position actuelle par un.
Ou mettre le fseek(f1, -2,SEEK_CUR) au début de la boucle while à faire pour la fread par 1 point et 1 point de retour...
Je crois, vous êtes à l'aide de
fseek
mal. Vérifierman fseek
sur Google.Essayez ceci:
Vous devez également définir la position au début du dernier élément:
Vous n'avez pas besoin
end
variable.Vous devriez vérifier les valeurs de retour de toutes les fonctions (
fgetc
fseek
etftell
). C'est une bonne pratique. Je ne sais pas si ce code fonctionne avec des fichiers vides ou qqch de similaire.Utilisation :
fseek(f1,-2,SEEK_CUR);
à dosJ'écris ce code ,Il peut travailler ,vous pouvez essayer:
Je voudrais utiliser deux flux d'imprimer les n dernières lignes du fichier:
Cela va dans O(lignes) d'exécution et O(lignes) de l'espace.
Une solution avec un O(lignes) d'exécution et O(N) l'espace est à l'aide d'une file d'attente: