【问题标题】:C++ binary file reading into structC++ 二进制文件读入结构
【发布时间】:2011-12-01 22:59:56
【问题描述】:

我已经使用如下结构编写了一个二进制文件:

struct block{
char data[32];
};

所以我最终得到的基本上是一个充满 char[32] 的大型二进制文件。数据在特定位置格式化,因此获取特定信息并不困难。但是,我尝试像这样读取文件:

int lines=0;
std::ifstream inputFile("file.bin",std::ios::binary);

while (!inputFile.eof())
{
    inputFile.read(blocks[lines].data, sizeof(block));
    lines++;
}

inputFile.close();
lines--;

然后像这样显示它:

std::cout<<"block 1: "<<blocks[0].data<<std::endl;
// etc ...

我认为 blocks[i].data 应该只给我属于索引 i 的 char[32],但它却给了我结构中从该索引到结构末尾的每个“数据”元素。我确信这是我对它的工作原理的误解。我的问题是:如何获取 blocks[i].data 所代表的 char[32]?

【问题讨论】:

    标签: c++ struct ifstream


    【解决方案1】:

    问题在于您的std::cout 输出语句。当您尝试输出blocks[0].data 时,operator&lt;&lt; 得到的是不是 32 个字符的数组,而是指向第一个字符的指针。这被解释为指向 C 字符串的指针,因此它会从那里输出在内存中找到的所有字符,直到找到 '\0'。由于每个数组元素仅包含文件中的相应字符,因此输出文件的所有字符(除非文件中有'\0',然后输出停止在那里)。此外,您似乎(不)幸运的是 '\0' 在内存中跟随您的数据,因此输出停止在那里(而不是之后继续输出内存中的任何内容,并且可能在结束时给出分段错误进程的内存已到达)。

    要将 32 个字符输出为字符,请使用std::cout.write(blocks[0].data,32)。否则要将它们作为整数输出,只需遍历它们并将每个转换为整数:

    for (int i = 0; i < 32; ++i)
      std::cout << static_cast<int>(blocks[0].data[i]) << ' ';
    

    当然,您可以使用所有流操作符来获取所需格式的数字(例如,std::hex 用于十六进制输出,和/或std::setwstd::setfill 用于获取固定宽度的数字)。

    【讨论】:

    • std::cout.write 成功了。数组被正确填充;这只是我使用的输出方法。谢谢。
    【解决方案2】:
    std::cout<<"block 1: "<<blocks[0].data<<std::endl;
    

    您正在向流发送char[],该流被提升为char*,因此它认为这是一个以NULL 结尾的字符串,并尝试将其显示为这样。很难说出你想要什么,但这会以十六进制显示:

    std::cout << std::setfill('0') << std::hex;
    for(int i=0; i<25; ++i)
        std::cout << std::setw(2) << blocks[0].data[i];
    std::cout << std::setfill(' ') << std::dec;
    

    【讨论】:

      【解决方案3】:

      您的输入部分需要更改:

      while (inputFile.read(blocks[lines].data, sizeof(block))
      {
           lines++;
      }
      

      原因是直到 AFTER 发生读取操作时才确定 EOF 条件。使用 EOF 检查的一个副作用是可能会读取额外的一行。

      【讨论】:

        猜你喜欢
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多