【问题标题】:Writing unsigned char into an output file将 unsigned char 写入输出文件
【发布时间】:2019-12-27 02:24:08
【问题描述】:

这可能是一个简单的问题,但我不确定为什么我没有做对。 我有 unsigned char buf,我需要将其数据写入输出文件 f_out。当我写如下:

f_out << buf;

我得到正确的数据。

但是我想逐行写入数据,32 位(char)一行,因为数据是二进制数。我使用了以下,但我得到了完全不同的数据:

for (int i = 1; i < Buff_size; i++) {
        for (int j = 1; j <= 32; j++) {
            f_out << buf[i];
        }
        f_out << endl;
    }

【问题讨论】:

  • 使用的编码是什么?
  • 这个循环for (int j = 1; j &lt;= 32; j++) { f_out &lt;&lt; buf[i]; } 将写入每个buf[i] 32 次​​b> - 这就是你想要的吗?
  • 哦,是的,现在我知道我在那里做了什么 :) 我已经修好了,现在可以正常工作了!非常感谢。 for (int i = 0; i
  • @MHDAnasAlsakkal 你有一个缓冲区溢出。您需要在循环中使用&lt; 而不是&lt;=。此外,您可以使用% 运算符代替j 变量。不过,我会使用完全不同的逻辑:int loops = Buff_size / 32; int offset = 0; for (int i = 0; i &lt; loops; ++i, offset += 32) { f_out.write(&amp;buf[offset], 32); f_out &lt;&lt; endl; } int remaining = Buff_size % 32; f_out.write(&amp;buf[offset], remaining);

标签: c++ file unsigned writing


【解决方案1】:

在您拥有的代码中,以下循环:

for (int j = 1; j <= 32; j++) {
    f_out << buf[i];
}

将在每一行写入数组的每个元素 32 次​​strong>!

如果你想做的是每个元素只写一次,但是每行有 32 个元素,你需要这样的东西:

int i, j;
for (i = 0, j = 0; i < Buff_size; i++) {
    f_out << buf[i];
    if (++j == 32) { // 32 done ...
        f_out << endl; // ... write newline
        j = 0;         // ... and reset count
    }
    else f_out << " "; // Stay on same line - but insert a space
}
if (j != 0) f_out << endl; // If we have 'leftover' buffer

请随时要求进一步解释和/或澄清。

【讨论】:

    【解决方案2】:

    不确定我是否有这个问题。您的代码中存在多个问题:

    (1) 你跳过了buf[0],这意味着第一个字节没有写入文件。

    (2) 同一个字节写了 32 次。

    这是你所期望的吗?我猜第二个代码应该更新为:

    assert(Buff_size%32 == 0)
    for (int i = 0; i < Buff_size/32; i++) {
            for (int j = 0; j < 32; j++) {
                f_out << buf[i*32 + j];
            }
            f_out << endl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多