Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
4.1.2, 4.1.3, 4.1.4, 4.2.0, 4.2.1
-
None
-
all
-
Incorrect Behavior
Description
Moved from the Rogue Wave bug tracking database:
Class/File: Fix Priority: Must Fix Long Description: *** Nov 10 1999 9:33PM *** sebor *** Problem: seekg - problem see seek2.cpp: The ANSI/ISO-C++ document(ISO/IEC 14882:1998(E)) states about the effects of seekg: ANSI> Effects: If fail() != true, executes rdbuf()í>pubseekpos( pos). (The RW-Implementation instead executes rdbuf()->pubseekpos(pos, ios_base::in);) pubseekpos calls seekpos which is declared: pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out); since the 2nd Argument (which) is not given in the above call of pubseekpos the value of the which-Argument is the default value ios_base::in | ios_base::out. seekpos should alter both the position in the input and the output sequence in this case. The RW-Implementation alters only the position in the input-sequence. Though the RW-implementation seems to be intuitivly right, it is formally not conforming. I think RogueWave should support the lwg issue No 136 described in http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-issues.html#136 TEST CASE: #include <string> #include <sstream> #include <iostream> using namespace std; typedef basic_stringbuf<char, char_traits<char>, allocator<char> > buffer; typedef basic_istream<char, char_traits<char> > input_stream; typedef char_traits <char> traits; typedef char_traits<char>::pos_type pos_type; #define VERIFY(p1,p2) verify(p1,p2,__LINE__) template <class T> void verify (T p1, T p2, int line) { if(p1 != p2) { cerr << "line " << line << ": " << p1 << " should be " << p2 << '\n'; } } template <> void verify (string p1, string p2, int line) { if(p1 != p2) { cerr << "line " << line << ": \"" << p1 << "\" should be \"" << p2 << "\" \n"; } } int main() { const string expstr ("Rogue Wave"); buffer buf (expstr, ios_base::in | ios_base::out); typedef basic_iostream<char, char_traits<char> > iostrm; iostrm iostobj(&buf); char s[80]; VERIFY ((void *)iostobj.rdbuf(),(void *)&buf); VERIFY (iostobj.gcount(),streamsize(0)); iostobj >> s; VERIFY (string(s), string("Rogue")); iostobj.get (s, sizeof s); VERIFY (string(s), string(" Wave")); iostobj.clear (); iostobj.seekg (0, ios::end); iostobj.write (" Software", 9); iostobj.seekp (0); iostobj.get (s, sizeof s); iostobj.clear (); VERIFY (string(s), string("Rogue Wave Software")); } CC -c -mt -D_RWSTD_USE_CONFIG -I/amd/devco/sebor/dev/stdlib/include -I/build/seb or/sunpro-5.8.j1-12d/include -I/amd/devco/sebor/dev/stdlib/examples/include -li brary=%none -O +w t.cpp CC t.o -o t -library=%none -L/build/sebor/sunpro-5.8.j1-12d/lib -mt -L/build/s ebor/sunpro-5.8.j1-12d/lib -lstd12d -lm line 55: " Software" should be "Rogue Wave Software"