2017-01-03 94 views
1

以下程序寫入100個字節,但不會全部讀回它們。爲什麼?寫入到流中,然後讀取ifstream不讀取整個文件

#include <iostream> 
#include <random> 
#include <vector> 
#include <climits> 
#include <algorithm> 
#include <map> 
#include <fstream> 
#include <iomanip> 

int main() 
{ 
    constexpr size_t file_size{100}; 
    std::random_device r{}; 
    auto min = std::numeric_limits<unsigned char>::min(); 
    auto max = std::numeric_limits<unsigned char>::max(); 
    std::uniform_int_distribution<size_t> ud{min,max}; 

    { 
     std::ofstream ofs{"otp.bin",std::ios::binary}; 
     for(size_t i{}; i < file_size; ++i) { 
      ofs << static_cast<unsigned char>(ud(r)); 
     } 
     ofs.close(); // not needed? 
    } 

    std::ifstream ifs{"otp.bin",std::ios::binary}; 

    unsigned char c{}; 
    size_t i{}; 
    while(ifs >> c) { 
     std::cout << std::setw(4) << std::hex << static_cast<unsigned int>(c) << std::dec << ((++i % 10 == 0) ? '\n' : ' '); 
    } 

    std::cout << '\n' << i << " bytes read.\n"; 
    return 0; 
} 

我有時會收到99,94,96,但從來沒有100我得到的VS2015,鐺和gcc這種行爲。

Here是一個在線示例。

+0

我不確定,但也許你必須在每次寫入後刷新輸出流 – baliman

+2

如果你要編寫一個二進制文件,使用無格式輸入/輸出函數,而不是格式化輸入/輸出函數。 (所以'read'和'write'不是提取和插入操作符。) –

回答

5
ifs >> c 

跳過默認情況下的空白。把

ifs >> std::noskipws; 

之前的循環還讀取空白字節。


而且

ofs.close(); // not needed? 

當流超出範圍不是確實需要,文件被關閉。

+0

謝謝!瞭解這種特定的行爲是一種解脫。我只是想直接訪問字節。我想我可以再次閱讀'ifstream'文檔。 – wally