Bonjour,

les fonctions seekg et seekp des flux standards me posent un problème de LSP : selon l'implémentation du flux, les pointeurs de position put et get sont modifiés indépendamment ou non (par exemple fstream vs stringstream).
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
void test_lsp(std::iostream & stream) 
{
    using namespace std;
 
    stream.seekg(0, iostream::beg);
    stream.seekp(0, iostream::beg);
 
    cout << "seekg(0, beg), seekp(0, beg) \n"
         << "tellg : "  << stream.tellg() << "\ntellp : " << stream.tellp()
         << "\n\n";
 
    stream.seekg(3, iostream::beg);
 
    cout << "seekg(3, beg)\n"
         << "tellg : "  << stream.tellg() << "\ntellp : " << stream.tellp()
         << "\n\n";
 
    stream.seekg(3, iostream::cur);
 
    cout << "seekg(3, cur)\n"
         << "tellg : "  << stream.tellg() << "\ntellp : " << stream.tellp()
         << "\n\n";
 
    stream.seekp(3, iostream::cur);
 
    cout << "seekp(3, cur)\n"
         << "tellg : "  << stream.tellg() << "\ntellp : " << stream.tellp()
         << "\n\n";
}
Citation Envoyé par Console
[ fstream ]
seekg(0, beg), seekp(0, beg)
tellg : 0
tellp : 0

seekg(3, beg)
tellg : 3
tellp : 3

seekg(3, cur)
tellg : 6
tellp : 6

seekp(3, cur)
tellg : 9
tellp : 9

[ stringstream ]
seekg(0, beg), seekp(0, beg)
tellg : 0
tellp : 0

seekg(3, beg)
tellg : 3
tellp : 0

seekg(3, cur)
tellg : 6
tellp : 0

seekp(3, cur)
tellg : 6
tellp : 3
L'appel de stream.seekg(x, iostream::cur); stream.seekp(x, iostream::cur) pouvant de fait soit décaler les pointeurs de x, soit de 2*x.

Quand aux fonctions pubseekoff / seekoff des streambuf, le standard ne leur permet pas de modifier simultanément les deux pointeurs à partir de la position courante.

Existe-il un moyen propre (ou à défaut pas trop sale ) de réaliser cela ?