QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 913|回复: 5

发现vc库的一个bug

[复制链接]
发表于 2004-7-24 17:22:40 | 显示全部楼层 |阅读模式
一个简单的程序:
[code:1]
#include <fstream>

int main(int argc, char* argv[])
{
        using namespace std;

        unsigned char data[] = { 0xFF, 0x01, 0x02 };

        basic_ofstream<unsigned char> ofs("a.bin", ios_base::binary);
        ofs.write(data, sizeof(data));
}
[/code:1]
但a.bin中只有0x01和0x02,0xFF丢失了
究其原因,是由于char_traits<unsigned char>也可以实例化,而char_traits<unsigned char>::eof()返回0xFF,所以被认为是eof而不予输出。在g++下,这段程序编译失败,显示找不到char_traits< unsigned char>::eof()。
发表于 2004-7-25 19:51:46 | 显示全部楼层
值得讨论,不过我不认为这是个bug
回复

使用道具 举报

 楼主| 发表于 2004-7-27 21:41:34 | 显示全部楼层
这是库的实现问题
ms的库错误的允许实例化char_traits<unsigned char>::eof
回复

使用道具 举报

发表于 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]
回复

使用道具 举报

发表于 2004-7-31 13:22:16 | 显示全部楼层
两位对c++都有比较深的造诣啊,希望能常来,以提高本版版员c++的应用水平   

我将 unsigned char 改成 char。运行结果正确。在xemacs的hex模式下 : [code:1]00000000: ff01 02                                  ...
[/code:1]我想这是各个版本的stl实现上的一点小差异吧。
回复

使用道具 举报

发表于 2004-7-31 13:29:38 | 显示全部楼层
从明年开始,我要好好学C++了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 18:19 , Processed in 0.041005 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表