📄 filebuf_virtuals.cc
字号:
//beg strmsz_1 = fb_03.in_avail(); pt_1 = fb_03.pubseekoff(2, std::ios_base::beg); strmsz_2 = fb_03.in_avail(); off_1 = pt_1; VERIFY( off_1 > 0 ); c1 = fb_03.snextc(); //current in pointer +1 VERIFY( c1 == '3' ); c2 = fb_03.sputc('\n'); //current in pointer +1 c3 = fb_03.sgetc(); VERIFY( c2 != c3 ); VERIFY( c3 == '4' ); fb_03.pubsync(); c1 = fb_03.sgetc(); VERIFY( c1 == c3 ); //cur // 27filebuf-3.txt = bd2\n456789:;<=>?... pt_2 = fb_03.pubseekoff(2, std::ios_base::cur); off_2 = pt_2; VERIFY( (off_2 == (off_1 + 2 + 1 + 1)) ); c1 = fb_03.snextc(); //current in pointer +1 VERIFY( c1 == '7' ); c2 = fb_03.sputc('x'); //test current out pointer c3 = fb_03.sputc('\n'); c1 = fb_03.sgetc(); fb_03.pubsync(); c3 = fb_03.sgetc(); VERIFY( c1 == c3 ); //end // 27filebuf-3.txt = "bd2\n456x\n9" pt_2 = fb_03.pubseekoff(0, std::ios_base::end, std::ios_base::in|std::ios_base::out); off_1 = pt_2; VERIFY( off_1 > off_2 ); //weak, but don't know exactly where it ends c3 = fb_03.sputc('\n'); strmsz_1 = fb_03.sputn("because because because. . .", 28); VERIFY( strmsz_1 == 28 ); c1 = fb_03.sungetc(); // Defect? retval of sungetc is not necessarily the character ungotten. // So re-get it. c1 = fb_03.sgetc(); fb_03.pubsync(); c3 = fb_03.sgetc(); VERIFY( c1 == c3 ); // IN // OUT // seekpos // pubseekpos(pos_type sp, ios_base::openmode) // alters the stream position to sp //IN|OUT //beg pt_1 = fb_03.pubseekoff(78, std::ios_base::beg); off_1 = pt_1; VERIFY( off_1 > 0 ); c1 = fb_03.snextc(); //current in pointer +1 VERIFY( c1 == ' ' ); c2 = fb_03.sputc('\n'); //test current out pointer c3 = fb_03.sgetc(); fb_03.pubsync(); //resets pointers pt_2 = fb_03.pubseekpos(pt_1); off_2 = pt_2; VERIFY( off_1 == off_2 ); c3 = fb_03.snextc(); //current in pointer +1 VERIFY( c2 == c3 ); pt_1 = fb_03.pubseekoff(0, std::ios_base::end); off_1 = pt_1; VERIFY( off_1 > off_2 ); fb_03.sputn("\nof the wonderful things he does!!\nok", 37); fb_03.pubsync(); // IN // OUT // VIRTUALS (indirectly tested) // underflow // if read position avail, returns *gptr() // pbackfail(int_type c) // put c back into input sequence // overflow // appends c to output seq // NB Have to close these suckers. . . // filebuf_type* close() fb_01.close(); fb_02.close(); fb_03.close(); VERIFY( !fb_01.is_open() ); VERIFY( !fb_02.is_open() ); VERIFY( !fb_03.is_open() );}void test06(){ using namespace std; typedef istream::int_type int_type; bool test = true; ifstream ifs(name_02); char buffer[] = "xxxxxxxxxx"; int_type len1 = ifs.rdbuf()->sgetn(buffer, sizeof(buffer)); VERIFY( len1 == sizeof(buffer) ); VERIFY( buffer[0] == 'a' );}// libstdc++/9322void test07(){ using std::locale; bool test = true; locale loc; std::filebuf ob; VERIFY( ob.getloc() == loc ); locale::global(locale("en_US")); VERIFY( ob.getloc() == loc ); locale loc_de ("de_DE"); locale ret = ob.pubimbue(loc_de); VERIFY( ob.getloc() == loc_de ); VERIFY( ret == loc ); locale::global(loc); VERIFY( ob.getloc() == loc_de );}class MyTraits : public std::char_traits<char>{public: static bool eq(char c1, char c2) { VERIFY( c1 != 'X' ); VERIFY( c2 != 'X' ); return std::char_traits<char>::eq(c1, c2); }};class MyBuf : public std::basic_streambuf<char, MyTraits>{ char buffer[8];public: MyBuf() { std::memset(buffer, 'X', sizeof(buffer)); std::memset(buffer + 2, 'f', 4); setg(buffer + 2, buffer + 2, buffer + 6); }};// libstdc++/9538void test08(){ bool test = true; MyBuf mb; mb.sputbackc('a'); }// libstdc++/9439, libstdc++/9425void test09(){ using namespace std; bool test = true; filebuf fbuf; fbuf.open(name_01, ios_base::in); filebuf::int_type r = fbuf.sputbackc('a'); fbuf.close(); VERIFY( r == filebuf::traits_type::eof() );}class Cvt_to_upper : public std::codecvt<char, char, mbstate_t>{ bool do_always_noconv() const throw() { return false; }};// libstdc++/9169void test10(){ using namespace std; bool test = true; locale c_loc; locale loc(c_loc, new Cvt_to_upper); string str("abcdefghijklmnopqrstuvwxyz"); string tmp; { ofstream out; out.imbue(loc); out.open(name_04); copy(str.begin(), str.end(), ostreambuf_iterator<char>(out)); } { ifstream in; in.open(name_04); copy(istreambuf_iterator<char>(in), istreambuf_iterator<char>(), back_inserter(tmp)); } VERIFY( tmp.size() == str.size() ); VERIFY( tmp == str );}// libstdc++/9825void test11(){ using namespace std; bool test = true; filebuf fbuf; fbuf.open(name_05, ios_base::in|ios_base::out|ios_base::trunc); fbuf.sputn("crazy bees!", 11); fbuf.pubseekoff(0, ios_base::beg); fbuf.sbumpc(); fbuf.sputbackc('x'); filebuf::int_type c = fbuf.sbumpc(); VERIFY( c == 'x' ); c = fbuf.sbumpc(); VERIFY( c == 'r' ); c = fbuf.sbumpc(); VERIFY( c == 'a' ); fbuf.close(); }class errorcvt : public std::codecvt<char, char, mbstate_t>{protected: std::codecvt_base::result do_out(mbstate_t&, const char* from, const char*, const char*& from_next, char* to, char*, char*& to_next) const { from_next = from; to_next = to; return std::codecvt<char, char, mbstate_t>::error; } virtual bool do_always_noconv() const throw() { return false; }};// libstdc++/9182void test12(){ using namespace std; bool test = true; locale loc; loc = locale(loc, new errorcvt); filebuf fbuf1; fbuf1.pubimbue(loc); fbuf1.open(name_06, ios_base::out | ios_base::trunc); fbuf1.sputn("ison", 4); int r = fbuf1.pubsync(); VERIFY( r == -1 ); fbuf1.close();}void test13(){ using namespace std; bool test = true; locale loc; loc = locale(loc, new errorcvt); filebuf fbuf1; fbuf1.pubimbue(loc); fbuf1.pubsetbuf(0, 0); fbuf1.open(name_06, ios_base::out | ios_base::trunc); streamsize n = fbuf1.sputn("onne", 4); VERIFY( n == 0 ); fbuf1.close();}class OverBuf : public std::filebuf{public: int_type pub_overflow(int_type c = traits_type::eof()) { return std::filebuf::overflow(c); }};// libstdc++/9988void test14(){ using namespace std; bool test = true; OverBuf fb; fb.open(name_07, ios_base::out | ios_base::trunc); fb.sputc('a'); fb.pub_overflow('b'); fb.pub_overflow(); fb.sputc('c'); fb.close(); filebuf fbin; fbin.open(name_07, ios_base::in); filebuf::int_type c; c = fbin.sbumpc(); VERIFY( c == 'a' ); c = fbin.sbumpc(); VERIFY( c == 'b' ); c = fbin.sbumpc(); VERIFY( c == 'c' ); c = fbin.sbumpc(); VERIFY( c == filebuf::traits_type::eof() ); fbin.close();}class UnderBuf : public std::filebuf{public: int_type pub_underflow() { return underflow(); } std::streamsize pub_showmanyc() { return showmanyc(); }};// libstdc++/10097void test15(){ using namespace std; bool test = true; const char* name = "tmp_fifo1"; signal(SIGPIPE, SIG_IGN); unlink(name); if (0 != mkfifo(name, S_IRWXU)) { VERIFY( false ); } int fval = fork(); if (fval == -1) { unlink(name); VERIFY( false ); } else if (fval == 0) { filebuf fbout; fbout.open(name, ios_base::out); fbout.sputn("0123456789", 10); fbout.pubsync(); sleep(2); fbout.close(); exit(0); } UnderBuf fb; fb.open(name, ios_base::in); sleep(1); fb.sgetc(); streamsize n = fb.pub_showmanyc(); while (n > 0) { --n; UnderBuf::int_type c = fb.pub_underflow(); VERIFY( c != UnderBuf::traits_type::eof() ); fb.sbumpc(); } fb.close();}main() { test01(); test02(); test03(); test04(); test05(); test06(); test07(); test08(); test09(); test10(); test11(); test12(); test13(); test14(); test15(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -