我正在尝试读取二进制文件的数据,遗憾的是,在C ++中打开这些数据与python有很大不同,因为它们具有字节模式。似乎C ++没有那个。
for (auto p = directory_iterator(path); p != directory_iterator(); p++) {
if (!is_directory(p->path()))
byte tmpdata;
std::ifstream tmpreader;
tmpreader.open(desfile, std::ios_base::binary);
int currentByte = tmpreader.get();
while (currentByte >= 0)
{
//std::cout << "Does this get Called?" << std::endl;
int currentByte = tmpreader.get();
tmpdata = currentByte;
}
tmpreader.close()
}
else
{
continue;
}
我基本上想要克隆Python在'rb'
模式下打开文件的方法。要拥有所有内容的实际字节数据(因为它具有非打印字符,即使对于C ++也是不可读的。大多数可能无法转换为有符号字符,因为它包含我需要在我的DLL中提供的zlib压缩数据解压缩所有。
我知道在Python中我可以这样做:
file_object = open('[file here]', 'rb')
结果证明用上面的C ++代码替换它有帮助。但是fopen
已被折旧,但我不在乎。
上面的代码没有做的是因为我没有读取缓冲区数据。我后来意识到fopen
,fseek
,fread
和fclose
是读取字节模式所需的函数(&#39; rb&#39;)。< / p>
for (auto p = directory_iterator(path); p != directory_iterator(); p++) {
if (!is_directory(p->path()))
{
std::string desfile = p->path().filename().string();
byte tmpdata;
unsigned char* data2;
FILE *fp = fopen("data.d", "rb");
fseek(fp, 0, SEEK_END); // GO TO END OF FILE
size_t size = ftell(fp);
fseek(fp, 0, SEEK_SET); // GO BACK TO START
data2 = new unsigned char[size];
tmpdata = fread(data2, 1, size, fp);
fclose(fp);
}
else
{
continue;
}
答案 0 :(得分:5)
int currentByte = tmpreader.get();
while (currentByte >= 0)
{
//std::cout << "Does this get Called?" << std::endl;
int currentByte = tmpreader.get();
//^ here!
您正在声明隐藏外部变量的第二个变量。但是,这个内部仅在while循环体内有效,因此while条件检查不再被修改的外部变量。而是这样做:
int currentByte;
while ((currentByte = tmpreader.get()) >= 0)
{