我正在尝试将大量数据从文件导入到 boost::dynamic_bitset。为此,我希望使用与 dynamic_bitset (uint32_t) 的块大小相匹配的 istream_iterator。
如下所示,我使用要导入的文件的位置来设置我的 ifstream。但是,一旦我使用 ifstream 初始化 istream_iterator,就会设置 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:
当错误与操作本身的内部逻辑有关时,failbit 通常由输入操作设置,因此流上的其他操作可能是可能的。而当错误涉及流的完整性丢失时,通常会设置 badbit,即使在流上执行不同的操作也可能会持续存在。通过调用成员函数 bad 可以独立检查 badbit。
编辑:
散列包含 160 位散列,由单独的 C 应用程序中的 SHA1 实现生成。该文件中有几千个哈希值。我想读取 5 个 4 字节的块,而不是 20 个 1 字节的块(因此我使用 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);