|
发表于 2004-7-28 12:42:52
|
显示全部楼层
参考了一下手册,ms应该是自己实现了一个char_traits<unsigned char>,标准里好像没有说实现char_traits<unsigned char>是必须的,试了下gcc,有编译错误,再查手册,原来如此,公司的linux环境上没装std c++的库,我就在cygwin下做了个简单实现。
结论是如果说这是bug,你必须看看ms的手册里关于char_traits<unsigned char>实现的设计是什么才能确定。
我gcc下的实现是图省事胡写的,不过可以做个实现参看 我想
[code:1]
#include <cstring>
#include <fstream>
typedef unsigned char uchar_t;
namespace std {
typedef struct char_traits<uchar_t> uchar_traits;
};
using namespace std;
///////////////////////////////////
uchar_traits::char_type
uchar_traits::to_char_type(const uchar_traits::int_type& v)
{
return (uchar_traits::char_type)v;
}
///////////////////////////////////
uchar_traits::int_type
uchar_traits::to_int_type(const uchar_traits::char_type& v)
{
return (uchar_traits::int_type)v;
}
///////////////////////////////////
bool
uchar_traits::eq(const uchar_traits::char_type& v1,const uchar_traits::char_type& v2)
{
return (v1==v2);
}
bool
uchar_traits::eq_int_type(const uchar_traits::int_type& v1, const uchar_traits::int_type& v2)
{
return (v1==v2);
}
///////////////////////////////////
uchar_traits::int_type
uchar_traits::eof()
{
return 0xff;
}
///////////////////////////////////
uchar_traits::int_type
uchar_traits::not_eof(const uchar_traits::int_type& v)
{
return 0xfe;
}
///////////////////////////////////
void
uchar_traits::assign(uchar_traits::char_type& v1, const uchar_traits::char_type& v2)
{
}
///////////////////////////////////
bool
uchar_traits::lt(const uchar_traits::char_type& v1, const uchar_traits::char_type& v2)
{
return (v1<v2);
}
int
uchar_traits::compare(const uchar_traits::char_type* v1,
const uchar_traits::char_type* v2,
size_t s)
{
return 0;
}
///////////////////////////////////
size_t
uchar_traits::length(const uchar_traits::char_type* v)
{
return strlen((const char*)v);
}
///////////////////////////////////
const uchar_traits::char_type*
find(const uchar_traits::char_type* t, int n, const uchar_traits::char_type& v)
{
char *t1, *t2, *t3;
t1 = (char*)t;
t2 = (char*)&v;
t3 = strstr(t1, t2);
return (uchar_t*) t3;
}
///////////////////////////////////
uchar_traits::char_type*
uchar_traits::copy(uchar_traits::char_type* v,const uchar_traits::char_type* t,
size_t s)
{
return (uchar_t*) strncpy ((char*)v, (char*)t, s);
}
///////////////////////////////////
uchar_traits::int_type
basic_filebuf<uchar_t, uchar_traits>::
_M_underflow_common(bool v)
{
return 0;
}
int main(int argc, char** argv)
{
unsigned char buf[] = {0xff, 0x01, 0x02};
basic_ofstream<unsigned char> ofs("a.bin", ios_base::binary);
ofs.write (buf, 3);
return 0;
}
[/code:1] |
|