您的位置:首页 > 其它

实现cin>>complex

2015-03-11 15:52 1431 查看
我以前的实现版本点击打开是是有问题的,因为我把整个流都弄下来了。

比如流里假如有(12, 3))87 ,实际上cin>>complex只是取流里的(12,3)而剩下的)87是不动它,由接下来的其他流读取。

而我则是整个都取下来了。虽然我的功能能够使用词法分析实现,但是不够优雅,在C++上更是错误的。

basic_istream_char* __cdecl basic_istream_char_read_complex_double(basic_istream_char *this, complex_double *v)
{
double r;
basic_ios_char *base = basic_istream_char_get_basic_ios(this);

TRACE("(%p %p)\n", this, v);//wine里用来追踪变量的,功能跟printf差不多

/* 因为正确的格式里只有real 和 (real)还有(real,imaginary),所以只会在流里取相应字符 */

ws_basic_istream_char(this);//先用ws()将流里开头的空白都去掉
//用peek()看看流里第一个字符是什么,不取出来
if(basic_istream_char_peek(this) == '(') {
char c;
basic_istream_char_get(this);//用get()取流第一个字符'(',不保存(因为不需要)
basic_istream_char_read_double(this, &r);//读流里的double

if(ios_base_fail(&base->base))//如果不是double类型,返错退出
return this;

ws_basic_istream_char(this);//接着又用ws()去掉接下来的空格(' ','\t')
c = basic_istream_char_peek(this);//用peek()把字符存到c,但不从流里取出
if(c == ',') {
double i;
basic_istream_char_get(this);//字符是',',complex正常格式,取出
basic_istream_char_read_double(this, &i);//继续读double

if(ios_base_fail(&base->base))//返回
return this;

ws_basic_istream_char(this);//继续去空格
c = basic_istream_char_peek(this);//用法同上
if(c == ')') {
/* 格式(real, imag) 所以get从流里取走'('*/
basic_istream_char_get(this);
v->real = r;
v->imag = i;
}else {
basic_ios_char_setstate(base, IOSTATE_failbit);
return this;
}
}else if(c == ')') {
/* 格式 (real) */
basic_istream_char_get(this);
v->real = r;
v->imag = 0;
}else {
basic_ios_char_setstate(base, IOSTATE_failbit);
return this;
}
}else {
/* 格式 real */
basic_istream_char_read_double(this, &r);

if(ios_base_fail(&base->base))
return this;
//如果是(12)这样的格式,只是取实数,虚数为0
v->real = r;
v->imag = 0;
}

return this;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: