免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3916 | 回复: 7
打印 上一主题 下一主题

[C++] 关于stringstream转换uint64_t的一点好奇 [复制链接]

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-08 21:01 |只看该作者 |倒序浏览
程序中解析json串遇到个小问题,经定位写了两个测试用例。
  1.   
  2.     uint64_t iTest=0;
  3.     string str;
  4.     stringstream ss(str);
  5.     ss >> iTest;    // 结果为140737488349184

  6. //----------------------------------------
  7.     uint64_t iTest=0;
  8.     stringstream ss("");
  9.     ss >> iTest;    // 结果为4295032831
复制代码
以上两个例子,原以为会是0,没想到是这两个结果,哪位给简单介绍一下是怎么个处理流程,多谢!

纯属好奇,不喜勿喷!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2015-09-09 08:17 |只看该作者
请问 ss >> iTest 执行成功了没有?
if( ss >> iTest )
   cout << iTest << endl;
else
   cerr << "failed.\n";

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
3 [报告]
发表于 2015-09-09 15:46 |只看该作者
bruceteen 发表于 2015-09-09 08:17
请问 ss >> iTest 执行成功了没有?
if( ss >> iTest )
   cout


多谢 提醒,我查了一下cplusplus,操作符 “>>"的返回值是一个istream类型,上面例子执行后,标志位failbit和eofbit会被设置。
在问一下,这个判断语句if( ss >> iTest )  是判断的什么?

string str("123");
stringstream ss(str);
ss >> iTest;
上述三条语句执行后,eofbit也被设置了
那么是以failbit被设置与否来判断">>"操作是否成功,还是安装你之前那个if...else?

多谢!

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
4 [报告]
发表于 2015-09-09 22:22 |只看该作者
表达式“ss >> iTest”返回值就是ss,ss有一个operator bool,返回值等同于ss.good(),用来检测这个stream是不是好着的,相当于(!bad() && !eof() && !fail())。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2015-09-10 08:37 |只看该作者
无论是 if( ss ) 还是 if( !ss ),最终都是调用fail()函数来判断
而fail()函数判断 badbit 和 failbit,badbit在你这里不可能有问题,因此就是判断failbit
failbit代表什么呢,代表是不是读入成功

例如你从"abc"中取个int,取后状态是:是fail、非eof, 此时 fail()==true
例如你从""中取个int,取后状态是:是fail、是eof, 此时 fail()==true

假如你从 "123 456" 中取个 int,取后状态是:非fail、非eof, 此时 fail()==false
再取个 int,取后状态是:非fail、是eof, 此时fail()==false
再取个 int,取后状态是:是fail、是eof, 此时fail()==true

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
6 [报告]
发表于 2015-09-11 09:30 |只看该作者
回复 5# bruceteen


    学习了,多谢!

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
7 [报告]
发表于 2015-09-11 09:41 |只看该作者
回复 4# windoze


    “operator bool”这句说道点子上了,多谢。
    不过,那个good和eof,经自己测试貌似不是
  1. int main()
  2. {
  3.     uint64_t iTest;
  4.     string str("123");
  5.     stringstream ss(str);
  6.     ss >> iTest;
  7.     if(ss)
  8.         cout << "good" << endl;
  9.     if(ss.eof())
  10.         cout << "eofbit" << endl

  11. }
复制代码
如上代码,输出的就是
good
eofbit

后来查了一下:

Evaluate stream
Returns whether an error flag is set (either failbit or badbit).
Notice that this function does not return the same as member good, but the opposite of member fail.

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
8 [报告]
发表于 2015-09-11 13:45 |只看该作者
回复 7# kaede_1


看了看文档,还真是我记错了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP