Lire un fichier à l’envers?

Existe-t-il un moyen de lire un fichier à l’envers, ligne par ligne, sans avoir à parcourir le fichier du début à la lecture précédente?

Selon le commentaire, une alternative possible (assez simple) serait de lire les lignes en un vector . Par exemple:

 #include  #include  #include  #include  int main() { std::ifstream in("main.cpp"); if (in.is_open()) { std::vector lines_in_reverse; std::ssortingng line; while (std::getline(in, line)) { // Store the lines in reverse order. lines_in_reverse.insert(lines_in_reverse.begin(), line); } } } 

MODIFIER:

Selon les commentaires de jrok et de Loki Astari , push_back() serait plus efficace mais les lignes seraient dans l’ordre des fichiers, donc reverse iteration ( reverse_iterator ) ou std::reverse() serait nécessaire:

  std::vector lines_in_order; std::ssortingng line; while (std::getline(in, line)) { lines_in_order.push_back(line); } 

Utilisez un fichier mappé en mémoire et revenez en arrière. Le système d’exploitation va rechercher les parties nécessaires du fichier dans l’ordre inverse.

  1. Ouvrez le fichier en lecture, appelez fseek() pour rechercher la fin du fichier, puis appelez ftell() pour obtenir la longueur du fichier. Sinon, vous pouvez obtenir la longueur du fichier en appelant stat() ou fstat()

  2. Atsortingbuez un pointeur de mémoire tampon à la taille de fichier obtenue en 1, ci-dessus.

  3. Lire le fichier entier dans ce tampon – vous pouvez probablement utiliser fread() pour lire le fichier en une seule fois (en supposant que le fichier soit suffisamment petit).

  4. Utilisez un autre pointeur de caractère pour traverser le fichier de la fin au début du tampon.

La réponse courte serait non. Cependant, vous pouvez utiliser la fonction seek () pour déplacer votre pointeur là où vous souhaitez aller. Puis read () des données à partir de ce point. Si vous savez bien gérer les tampons, cela devrait être assez rapide, car vous pouvez lire et mettre en cache les données, puis rechercher le ou les caractères de nouvelle ligne précédents. Amusez-vous avec \ r \ n qui sera inversé …

– Mise à jour: quelques détails sur l’algorithme possible –

Ce n’est pas un code valide, mais il devrait vous donner une idée de ce que j’essaie de dire ici.

Le fichier lit:

 int fpos = in.size() - BUFSIZ; char buf[BUFSIZ]; in.seek(fpos); in.read(buf, BUFSIZ); fpos -= BUFSIZ; // repeat until fpos < 0, although think of size % BUFSIZ != 0 // now buf has characters... reset buffer position int bpos = BUFSIZ - 1; 

Obtenir de la ficelle:

 // first time you need to call the read if(bpos == -1) do_a_read(); // getting ssortingng std::ssortingng s; while(bpos >= 0 && buf[bpos] != '\n') { s.insert(0, 1, buf[bpos]); --bpos; } // if bpos == -1 and buf[0] != '\n' then you need to read another BUFSIZ chars // and repeat the previous loop... // before leaving, skip all '\n' while(bpos >= 0 && buf[bpos] == '\n') { --bpos; } return s; 

Pour vous faciliter la tâche avec "\ r", vous pouvez avoir une première passe qui transforme tous les "\ r" en "\ n". Sinon, tous les tests de '\ n' doivent également tester '\ r'.

La version légèrement améliorée sera ceci: –
1) Chercher la dernière position
2) Obtenez le dernier-1 position
3) Lire un caractère et l’imprimer;
4) chercher 2 pos dos;
5) répéter 3 et 4 pour le last-1 ;

  ifstream in; in.open("file.txt"); char ch; int pos; in.seekg(-1,ios::end); pos=in.tellg(); for(int i=0;i