作者chrisdar ()
看板C_and_CPP
標題[問題] basic_ifstream & istreambuf_iterator
時間Sun Apr 26 07:16:15 2015
開發平台(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
推 LPH66: 看了一下我手上的 VS2013 的 istreambuf_iterator 實作 04/26 12:08
→ LPH66: 跟 g++ 4.9 的實作, 結論是這是 VS 的 bug 04/26 12:08
→ LPH66: VS 內部把 istream_iterator 實作成這樣是錯的 04/26 12:09
推 LPH66: 唔, 我做了一點實驗, 問題似乎是出在你用 <unsigned int> 04/26 12:42
→ LPH66: 當模版參數...g++ 4.9 好像因為這樣會扔 bad_cast 出來 04/26 12:42
→ LPH66: 你要不要一次讀一個 byte 然後自己組起來? 04/26 12:44
→ LPH66: 單獨讀一個 byte 的話內部會轉成 int 再比較 eof 04/26 12:45
→ LPH66: 這樣就不會有這個問題, 0xff 也能正確的讀出來 04/26 12:46
→ LPH66: 又找了一些資料, 好像用 <unsigned int> 在部份編譯器 04/26 12:47
→ LPH66: 會變成多位元組字集轉碼, 而不是一次讀四個 byte 進來... 04/26 12:48
→ LPH66: 總之你還是用普通的 ifstream 就好了 04/26 12:49
→ PkmX: 標準對非{char,wchar_t,char16_t,char32_t}的char_traits 04/26 13:32
→ PkmX: 似乎是沒有什麼規範 我也覺得你用char讀比較好 04/26 13:33
→ PkmX: 順便處理endianness的問題 04/26 13:33
→ chrisdar: 感謝回復 已改用char 一個一個讀 04/26 13:40