无法在C ++中以字节模式读取二进制文件

时间:2016-08-24 11:38:32

标签: c++ c++14

我正在尝试读取二进制文件的数据,遗憾的是,在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已被折旧,但我不在乎。

上面的代码没有做的是因为我没有读取缓冲区数据。我后来意识到fopenfseekfreadfclose是读取字节模式所需的函数(&#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;
}

1 个答案:

答案 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)
{