【问题标题】:Problem with reading a binary file in cpp?在 cpp 中读取二进制文件有问题吗?
【发布时间】:2022-01-08 02:52:56
【问题描述】:

我有一个名为“input.bin”的二进制文件,其中每个字符都是 4 位。该文件包含此类数据:

0f00 0004 0018 0000 a040 420f 0016 030b
0000 8000 0000 0000 0000 0004 0018 0000

其中 0f 是第一个字节。

我想读取这些数据并这样做,我正在使用以下代码:

#include <string>
#include <iostream>
#include <fstream>

int main()
{
      char buffer[100];
      std::ifstream myFile ("input.bin", std::ios::in | std::ios::binary);
      myFile.read (buffer, 100);

      if (!myFile.read (buffer, 100)) {
        std::cout << "Could not open the required file\n";
      }
      else
      {
        for (int i = 0; i < 4; i++)
        {
          std::cout << "buffer[" << i << "] = " << static_cast<unsigned>(buffer[i]) << std::endl;
        }
        myFile.close();
      }
    return 0;
}

目前我只打印四个字节的数据,当我运行它时,我得到了这个输出:

buffer[0] = 0
buffer[1] = 24
buffer[2] = 0
buffer[3] = 0

为什么它不打印 0f 的值,而只在索引 1 中打印 18 的值,而实际上它在索引 6 处?

【问题讨论】:

  • 先将你的输出写入一个文本文件,然后打开这个文件并用 NotePad++、Sublime Text 等智能文本编辑器检查它。 Windows 控制台不是测试字符的最佳选择。
  • 你可能想用十六进制打印。您正在打印的 4 个字符中有 3 个无法打印。查看 ASCII 表中的低值:https://www.asciitable.com/
  • 打印前转换为 int
  • &lt;&lt; buffer[i] --> &lt;&lt; static_cast&lt;int&gt;(buffer[i]) -- 然后您实际上看到的是十进制值,而不是框字符和空格。
  • 您通过读取两次跳过了前 100 个字节。

标签: c++ binaryfiles file-handling


【解决方案1】:

问题来了

myFile.read (buffer, 100);

if (!myFile.read (buffer, 100)) {

你读了两次,因此忽略了前 100 个字节(如果它们超过 100 个)。

去掉第一个read,或者将条件改为if (!myFile)

【讨论】:

    【解决方案2】:

    您将数据内容打印为字符。而且前四个字节都不是真正可打印的字符。

    您需要将它们打印为(无符号)整数:

    // Unsigned bytes to avoid possible sign extensions in conversions
    unsigned char buffer[100];
    
    ...
    
    // Convert the bytes to unsigned int for printing their numerical values
    std::cout << "buffer[" << i << "] = " << static_cast<unsigned>(buffer[i]) << '\n';
    

    【讨论】:

    • 将缓冲区类型从 char 更改为 unsigned char 给我这个错误:错误:从 'unsigned char*' 到 'std::basic_istream::char_type* {aka char* }' [-fpermissive] myFile.read (buffer, 100);
    • 对上述问题有帮助吗?
    • @MobiZaman 加入read 电话:reinterpret_cast&lt;char*&gt;(buffer)
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2011-10-24
    • 2021-12-26
    • 2017-09-01
    相关资源
    最近更新 更多