无法在C ++中读取二进制文件

时间:2017-04-06 15:36:55

标签: c++ binary readfile

我目前正致力于可以读取二进制文件的程序。我知道有很多主题回答同样的问题,但我的问题非常奇怪,我没有找到任何答案。

所以我知道二进制文件的结构:

  • 4字节:文件中的表数 然后是文件中的第一个表:
  • 4个字节:表中的数据类型
  • 4个字节:表名称的长度
  • L字节:表的名称
  • 4个字节:行数
  • 4个字节:列数
  • Nbr of lines * Nbr of columns * sizeof(type)bytes:Data

因此,使用读取指令,我设法获取所有内容,直到数据。 例如,在我的第一个二进制文件中,我的第一个表是浮动数字3行和300 000列。我设法得到第一个66然后我得到一个endofFile标志在67和坏字节标志所有899 932其他浮动我试图读。

以下是我的代码代码的一些部分(效果很好)

uint32_t tableManager::getNbrTables()
{   
    uint32_t a;
    file.read(reinterpret_cast<char *>(&a), sizeof(a));
    return a;
}

uint32_t tableManager::getTypeData(int k)
{   
    uint32_t a;
    file.read(reinterpret_cast<char *>(&a), sizeof(a));
    return (a - 1);
}

这些让我得到了我需要的标题的正确值。然后我使用循环来获取具有以下代码的数据值:

vector<vector<float>> tmpL(nbrL[m]);
    vector<float> tmpC(nbrC[m]);    
    switch (typeData[m])
    {
    case 0: 
        char x0;
        for(int n = 0; n < nbrL[m]; n++)
        {
            for(int o = 0; o < nbrC[m]; o++)
            {               
                file.read(reinterpret_cast<char *>(&x0), sizeof(x0));
                tmpC.push_back(x0);
            }
            tmpL.push_back(tmpC);
        }
        dataT.push_back(tmpL);
        break;
    case 1:
        float x1;
        for(int n = 0; n < nbrL[m]; n++)
        {
            for(int o = 0; o < nbrC[m]; o++)
            {               
                file.read(reinterpret_cast<char *>(&x1), sizeof(x1));
                tmpC.push_back(x1);
            }
            tmpL.push_back(tmpC);
        }
        dataT.push_back(tmpL);
        break;
    }

在函数m = 0的调用中,这意味着它是数据中两个表中的第一个。

但我不知道的是为什么数据阅读的开始起作用,然后在几次阅读后停止工作。 根据我使用的二进制文件,始终正确读取标题,但读取的浮点数的数量会有所不同,即使至少读取了两个。

我尝试使用seekg()手动放置读取点,但它完全相同。

如果您发现了某些内容或需要更多信息,请感谢您的回答

1 个答案:

答案 0 :(得分:2)

On Windows you need to open the file with the "b" flag to make sure text interpretation doesn't happen. There are significant changes that happen in text mode:

  1. The combination \x0d\x0a gets converted to \x0a. (Or perhaps \x0d gets dropped altogether, I forget).
  2. \x1a is considered end-of-file and reading stops.

Both of these will be fatal when trying to read binary data. Binary data is essentially random, so you have a 1/65536 chance of hitting the first condition and 1/256 chance of hitting the second!

Most other OS's don't distinguish between binary and text mode, so you won't run into this problem on those platforms.