2017-01-03 2 views
1

次のプログラムは100バイトを書き込みますが、すべて読み戻すことはありません。どうして?ofstreamに次の文字を書き込んで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、clang、gccで取得します。

Hereは、オンラインの例です。

+0

それぞれの書き込み後に出力ストリームをフラッシュする必要があるかもしれません。 – baliman

+2

バイナリファイルを書き込む場合は、書式付き入出力関数ではなく書式なしの入出力関数を使用してください。 (したがって、 'read'と' write'は抽出と挿入の演算子ではありません) –

答えて

5
ifs >> c 

デフォルトの空白をスキップします。ループの前に空白バイトも読み込むには、

ifs >> std::noskipws; 

の前に入力します。


また

ofs.close(); // not needed? 

本当に必要ないストリームがスコープの外に出たとき、ファイルが閉じられています。

+0

ありがとう!この特定の動作を知ることは安心です。私はちょうどバイトに直接アクセスしたかった。もう一度 'ifstream'のドキュメントを読む時間です。 – wally

関連する問題