【发布时间】:2013-01-26 22:01:54
【问题描述】:
我正在尝试将大量数据从文件导入到 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 通常是 当错误涉及流的完整性丢失时设置,这 即使对 溪流。可以通过调用成员函数独立检查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);
【问题讨论】:
-
我认为所有 fstream 都是基于字符的
-
@Non-StopTimeTravel 将 uint32_t 更改为 uint8_t 会使错误消失。令人失望的是,读取 4 个字节的块可能比读取 1 个字节的块更有效。不确定我是否理解为什么这是不可能的——istream_iterator 不应该一次简单地从 ifstream 读取 4 个字节吗?
-
代码应该可以工作,除非数据不能被读取为
uint32_t,文件包含什么? -
@JesseGood 我添加了有关文件制作者的详细信息。生产者正在将多个 chars / uint8_ts 写入文件。我希望将 4 个 uint8_t 块作为单个 uint32_t 块读取。
-
@Bschlinker:按照这种逻辑,vector
::iterator 应该能够遍历 vectoe ,这是没有意义的。迭代器匹配容器元素类型,因此通过相同的基本推理,它们也应该匹配流单元类型
标签: c++ file-io ifstream istream-iterator