Bonjour,

lorsque on est arrivé à la fin du fichier, seekg devrait repositionner de deux tampons en arrière et source.read devait charger le tampon précédent. Dans le débogueur, le tampon reste le même dans le tableau tampon. Pourquoi seekg ne recule pas?
quelqu'un a une idée?

scanneur.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <string>
#include <fstream>
#include <iostream>
 
#include "scanneur.hpp"
 
scanneur::scanneur(std::string nomfichier):enavant(0),nbtampons(0){
  char c;
  source.open(nomfichier.c_str(),std::ifstream::binary);
  if( ! source.is_open()){
    std::cerr<<"impossible d'ouvrir "<<nomfichier<<std::endl;
    exit(1);
  }
  source.seekg(0,source.end);
  taillefichier = source.tellg();
  source.seekg (0, source.beg);
  source.read(tampon,tailletampon);
  nbtampons++;
  tampon[tailletampon]=EOF;//sentinelle
  lus=source.gcount();
  if(lus<tailletampon)
    tampon[lus]=EOF;
  for(c=carsuiv();c!=EOF;c=carsuiv())
    if(c=='\n')
      std::cout<<std::endl;
    else
      std::cout << c;
  for(int i=0;i<taillefichier;i++){
    reculer(2);
    c=carsuiv();
    if(c=='\n')
      std::cout<<std::endl;
    else
      std::cout<<c;
  }
}
 
char scanneur::carsuiv(){
  char c=tampon[enavant++];
  if(c==EOF){
    if(enavant==tailletampon+1){//+1 car enavant a été incrémenté
      source.read(tampon,tailletampon);
      nbtampons++;
      tampon[tailletampon]=EOF;//sentinelle
      lus=source.gcount();
      tampon[lus]=EOF;//dernier caractère du tampon chargé
      enavant=0;
      c=tampon[enavant++];
    }
  }
  return c;
}
 
void scanneur::reculer(int n){
  for(int i=0;i<n;i++)
    if(enavant>0)
      enavant--;
    else{
      if(nbtampons>1){
	nbtampons-=2;
	source.seekg(nbtampons*tailletampon,std::ios::beg);
	nbtampons++;
	source.read(tampon,tailletampon);
	enavant=source.gcount();
      }
    }
}
scanneur.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef SCANNEUR_HPP
#define SCANNEUR_HPP
#include <fstream>
 
constexpr int tailletampon=7;
 
class scanneur{
public:
  scanneur(std::string nomfichier);
  char carsuiv();
  void reculer(int n);
private:
  char tampon[tailletampon+1];//+1 pour la sentinelle
  int enavant,taillefichier,lus,nbtampons;
  std::ifstream source;
};
#endif
main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include "scanneur.hpp"
 
 
int main(int argc,char *argv[]){
  if(argc==1){
    std::cerr<<"indiquez le fichier source"<<std::endl;
    exit(2);
  }
  std::string in=argv[1];
  scanneur scan(in);
  return 0;
}