2011-11-10 14 views
4

を読んされていない使用して、私は188バイトのファイルに使用されている次のコードを持っている:それは唯一であるしかしのstd ::はifstream、STD :: istream_iteratorとstd ::コピーはファイル全体

std::ifstream is("filename", std::ios::binary); 

std::vector<uint8_t> buffer; 
std::istream_iterator<uint8_t> i_input(is); 
std::copy(i_input, std::istream_iterator<uint8_t>(), 
      std::back_inserter(buffer)); 

std::cout << buffer.size(); 

を188バイトのうち186バイトを読み取る。

ファイルサイズは、ヘキサエディタとls -alで確認しました。

+1

これを確認できます。ファイルは368バイトですが、ベクトルサイズは312です.GCCのバージョンは 'gcc(Debian 4.4.5-8)4.4.5'です。 –

答えて

11

私はなぜ知っているが、空白をスキップするように思わデフォルトではありません。 noskipwsで無効にする必要があります。

is >> std::noskipws; 
+0

それは私のためだった。バイナリモードで開くと、ストリームが空白をスキップしなければならないのは奇妙なことです。 –

+2

@JoachimPileborg:バイナリモードとは関係ありません。あなたは、あらゆる種類のマングリングとスキップを行う*書式付き抽出*を使用しています。おそらく、 'char'へのフォーマットされた抽出は、生のファイルを読み込む最悪の方法でなければなりません! –

+0

@KerrekSBあなたはそうです。私が思うように早くになっていなければなりません。 –

8

最後の2バイトは何ですか?また、このようなバイナリデータを読み取るのに実際にはistream_iteratorは必要ありません。これは過剰で、おそらくstreambufを使用するよりも遅いです。

wilhelmtell's great answerからこの例を参照してください:

#include<iterator> 
// ... 

std::ifstream testFile("testfile", std::ios::in | std::ios::binary); 
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), 
           std::istreambuf_iterator<char>()); 
+0

ありがとう!私はこの方法に切り替えると思う。 –

関連する問題