std stream : seekg, seekp violation du LSP ?
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 8O (par exemple fstream vs stringstream).
Code:
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 :aie:) de réaliser cela ?