help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

about g++ 3.0


From: PeterPan
Subject: about g++ 3.0
Date: Fri, 22 Jun 2001 16:38:05 +0800

hi, 2 problems:

        1. All the document I saw told me iostream::overflow(int ch) should 
return non-EOF for no error,
but the code in g++ 3.0 assumed that it should return ch (the input), did the 
standard changed ??

in ostream.tcc line 353:

  template<typename _CharT, typename _Traits>
    basic_ostream<_CharT, _Traits>&
    basic_ostream<_CharT, _Traits>::put(char_type __c)
    {
      sentry __cerb(*this);
      if (__cerb)
        {
          int_type __put = rdbuf()->sputc(__c);
//---------------------------------------------------------------------------------
          if (__put != traits_type::to_int_type(__c))
//---------------------------------------------------------------------------------
       //sputc should return the input on success, it's ok
            this->setstate(ios_base::badbit);
        }
      return *this;
    }

in streambuf.tcc line 95:

  template<typename _CharT, typename _Traits>
    basic_streambuf<_CharT, _Traits>::int_type
    basic_streambuf<_CharT, _Traits>::
    sputc(char_type __c)
    {
      int_type __ret;
      if (_M_out_buf_size())
        {
          *_M_out_cur = __c;
          _M_out_cur_move(1);
          __ret = traits_type::to_int_type(__c);
        }
      else
        __ret = this->overflow(traits_type::to_int_type(__c));
//=========================================================================================
                 
// must overflow() return the input on success? not just a non-EOF value ??
      return __ret;
    }

        2. I can't use filebuf to read data properly from a socket:

#include <iostream>
#include <iomanip>
#include <sys/types.h>
#include <sys/socket.h>
#include <fstream>
#include <unistd.h>
using namespace std;
int main(void)
{
        int fds[2];
        socketpair(AF_UNIX, SOCK_STREAM,0,fds);
        perror("socketpair");
        FILE *fp=fdopen(fds[0],"r+");
        assert(fp!=NULL);
        write(fds[1],"hahahoho\n",sizeof("hahahoho\n"));
        string data;
//        filebuf fbuf(fp,ios::in|ios::out,0);  //all following 3 method not 
work
//        filebuf fbuf(fp,ios::in|ios::out,1);
        filebuf fbuf(fp,ios::in|ios::out);
        //peterpan test              
        {                            
                char buf[2048];      
                cerr<<"test read ...";
                //int n=fbuf.sgetn(buf,2048);
                int n=fbuf.sbumpc();
                while(n!=EOF&&n!='\n'){
                        cerr<<char(n);
                        n=fbuf.sbumpc();
                }                               //should ouput "hahahoho"
                //cerr<<"test read: "<<n<<' '<<string(buf,n)<<endl;
        }                                       //can't pass this test means 
can't use the fbuf in a iostream
        //fbuf.pubsetbuf(NULL,0);    
        perror("get fbuf");          
        //fstream conn (connfd);     
        iostream conn(&fbuf);        
        cerr<<"get data..."<<endl;   
        std::getline (conn, data);   
        cerr<<data<<endl;
} 

Regards.

Guo Xuesong

reply via email to

[Prev in Thread] Current Thread [Next in Thread]