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