[問題] basic_ifstream & istreambuf_iterator

看板C_and_CPP (C/C++)作者時間11年前 (2015/04/26 07:16), 編輯推噓2(2013)
留言15則, 3人參與, 最新討論串1/1
開發平台(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 就會提前離開, 請問如何如何修正? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.233.6.158 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1430003778.A.F48.html

04/26 12:08, , 1F
看了一下我手上的 VS2013 的 istreambuf_iterator 實作
04/26 12:08, 1F

04/26 12:08, , 2F
跟 g++ 4.9 的實作, 結論是這是 VS 的 bug
04/26 12:08, 2F

04/26 12:09, , 3F
VS 內部把 istream_iterator 實作成這樣是錯的
04/26 12:09, 3F

04/26 12:42, , 4F
唔, 我做了一點實驗, 問題似乎是出在你用 <unsigned int>
04/26 12:42, 4F

04/26 12:42, , 5F
當模版參數...g++ 4.9 好像因為這樣會扔 bad_cast 出來
04/26 12:42, 5F

04/26 12:44, , 6F
你要不要一次讀一個 byte 然後自己組起來?
04/26 12:44, 6F

04/26 12:45, , 7F
單獨讀一個 byte 的話內部會轉成 int 再比較 eof
04/26 12:45, 7F

04/26 12:46, , 8F
這樣就不會有這個問題, 0xff 也能正確的讀出來
04/26 12:46, 8F

04/26 12:47, , 9F
又找了一些資料, 好像用 <unsigned int> 在部份編譯器
04/26 12:47, 9F

04/26 12:48, , 10F
會變成多位元組字集轉碼, 而不是一次讀四個 byte 進來...
04/26 12:48, 10F

04/26 12:49, , 11F
總之你還是用普通的 ifstream 就好了
04/26 12:49, 11F

04/26 13:32, , 12F
標準對非{char,wchar_t,char16_t,char32_t}的char_traits
04/26 13:32, 12F

04/26 13:33, , 13F
似乎是沒有什麼規範 我也覺得你用char讀比較好
04/26 13:33, 13F

04/26 13:33, , 14F
順便處理endianness的問題
04/26 13:33, 14F

04/26 13:40, , 15F
感謝回復 已改用char 一個一個讀
04/26 13:40, 15F
文章代碼(AID): #1LF212z8 (C_and_CPP)
文章代碼(AID): #1LF212z8 (C_and_CPP)