ファイルからboost::dynamic_bitsetに大量のデータをインポートしようとしています。これを実現するために、dynamic_bitset(uint32_t)のブロックサイズに一致するistream_iteratorを使用したいと考えていました。
以下に示すように、インポートするファイルの場所を使用してifstreamを設定します。ただし、istream_iteratorをifstreamで初期化すると、ifstreamの失敗ビットが設定されます。
これが発生している理由に関するアドバイスはありますか?
ifstream memHashes (hashFileLocation, ios::in | ios::binary);
if(memHashes.is_open() == false || memHashes.good() == false) { break; }
std::istream_iterator<uint32_t> memHashesIt(memHashes);
std::istream_iterator<uint32_t> memHashesEOFIt;
cplusplus.comによると:
フェイルビットは通常、エラーが操作自体の内部ロジックに関連している場合に入力操作によって設定されるため、ストリーム上の他の操作が可能になる場合があります。通常、badbitは、エラーにストリームの整合性の喪失が含まれる場合に設定されます。これは、ストリームで別の操作が実行された場合でも持続する可能性があります。badbitは、メンバー関数badを呼び出すことで個別にチェックできます。
編集:
ハッシュには、別のCアプリケーションのSHA1実装によって生成された160ビットのハッシュが含まれています。このファイルには数千のハッシュがあります。1バイトの20ブロックではなく、4バイトの5ブロックを読み取りたい(したがって、ブロックサイズとしてuint32_tを使用)Cアプリケーションから関連するコードを取得しました。これは、生成されたハッシュを示してから、ファイルに書き込まれる:
#define HASH_SIZE 20 // 160 bits / 8 bits per byte = 20 bytes
FILE *fp;
fp = fopen(hash_filename, "wb");
if (!fp) {
MSG("Hash dump file cannot be opened");
fclose(fp);
return NULL;
}
uint8_t *p;
unsigned char hash[HASH_SIZE];
SHA1((unsigned char*)p, LENGTH_TO_HASH, hash);
fwrite(hash, HASH_SIZE, 1, fp);