【问题标题】:Writing 0's to a binary file C++将 0 写入二进制文件 C++
【发布时间】:2013-04-29 17:50:03
【问题描述】:

我想将一系列 0 写入二进制文件。作为一个字符,这应该是一个空格,但是,当我写入我的文件时,我收到了许多其他奇怪的字符。我不是在写零,而是在写别的东西。

我这样做正确吗?

代码:

int zero = 0;
myfile.write(reinterpret_cast<char *>(&zero),1790*sizeof(char));    

【问题讨论】:

  • 你真的应该得到一本关于 C/C++ 的入门书并学习它。你有一个非常基本的问题。
  • 首先,把你的故事讲清楚!你有大写字母 O,然后你说它是一个 char(即字符),然后它是一个空格(即 ASCII 32)。
  • 这里有几处不对劲: 1. 你不应该需要 reinterpret_cast 来解决这个问题。 2.您没有正确调用write()。 3. 您似乎不清楚 0、'O' 和空格字符之间的区别。 4. 你需要更多地了解指针。但你可以做到 - 只是学习一些(:
  • head -c 1790 /dev/zero &gt; myfile

标签: c++ file binary


【解决方案1】:

这样

for (int i = 0; i < 1790; ++i)
{
    char zero = 0;
    myfile.write(&zero, sizeof(char));
}

您的代码写入了 1790 个字节,但 zero 只有四个字节大,因此您最终会写入随机垃圾。

另一种方法是

char zero[1790] = { 0 };
myfile.write(zero, sizeof zero);

重点是,当您使用write 时,要写入的第一个参数的大小必须至少与要写入的第二个参数的值一样大。

【讨论】:

    【解决方案2】:

    您正在写入从地址&amp;zero 开始的 1790 字节的随机内存。该内存的前 4 个字节将为零(zero 的值假设为 sizeof(int)==4),其余的可能不是。

    【讨论】:

    • 从技术上讲,行为是未定义的(不是随机的,甚至不是任何东西 - 例如,它可能会出现段错误)。
    • 比“随机记忆”差很多。
    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多