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
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
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(); } } }
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
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
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; }
Partager