[问题] basic_ifstream & istreambuf_iterator

楼主: chrisdar   2015-04-26 07:16:15
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
MSVS 2010
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
STL
问题(Question):
下面程式码总是没有完整的把档案读完印出来
喂入的资料(Input):
一个 (档案大小%4==0) 的二进制档案, 其中含有 0xFFFFFFFF 在 (位置%4==0) 的地方
预期的正确结果(Expected Output):
将档案内容完整印出
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
std::basic_ifstream<unsigned int> file ("1.bin", std::ios::binary);
std::for_each (std::istreambuf_iterator<unsigned int> (file),
std::istreambuf_iterator<unsigned int>(),
[] (const unsigned int &value) {
std::cout << "0x" << std::setw (8) << std::setfill ('0') << std::hex
<< value << std::endl;
});
补充说明(Supplement):
看起来只要读到和 std::char_traits<unsigned int>().eof() 相同的值
0xffffffff
for_each 就会提前离开, 请问如何如何修正?
作者: LPH66 (-6.2598534e+18f)   2015-04-26 12:08:00
看了一下我手上的 VS2013 的 istreambuf_iterator 实作跟 g++ 4.9 的实作, 结论是这是 VS 的 bugVS 内部把 istream_iterator 实作成这样是错的唔, 我做了一点实验, 问题似乎是出在你用 <unsigned int>当模版参数...g++ 4.9 好像因为这样会扔 bad_cast 出来你要不要一次读一个 byte 然后自己组起来?单独读一个 byte 的话内部会转成 int 再比较 eof这样就不会有这个问题, 0xff 也能正确的读出来又找了一些资料, 好像用 <unsigned int> 在部份编译器会变成多字节字集转码, 而不是一次读四个 byte 进来...总之你还是用普通的 ifstream 就好了
作者: PkmX (阿猫)   2015-04-26 13:32:00
标准对非{char,wchar_t,char16_t,char32_t}的char_traits似乎是没有什么规范 我也觉得你用char读比较好顺便处理endianness的问题
楼主: chrisdar   2015-04-26 13:40:00
感谢回复 已改用char 一个一个读

Links booklink

Contact Us: admin [ a t ] ucptt.com