【问题标题】:C++ and binary files - newbie questionC++ 和二进制文件 - 新手问题
【发布时间】:2011-08-25 22:01:56
【问题描述】:

我有以下代码,我正在尝试在二进制文件中写入一些数据。 问题是我对二进制文件没有任何经验,我无法理解我在做什么。

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

#define RPF 5

using namespace std;

int write_header(int h_len, ofstream& f)
{
    int h;
    for(h=0;h<h_len;h++)
    {
        int num = 0;
        f.write((char*)&num,sizeof(char));
    }
    return 0;
}
int new_file(const char* name)
{
    ofstream n_file(name,ofstream::binary);
    write_header(RPF,n_file);
    n_file.close();
    return 0;
}

int main(int argc, char **argv)
{
    ofstream file("file.dat",ofstream::binary);
    file.seekp(10);
    file.write("this is a message",3);
    new_file("file1.dat");
    cin.get();
    return 0;
}

1。如您所见,我正在打开 file.dat 并在“thi”一词中写入。然后我打开文件,我看到它的 ASCII 值。为什么会这样?

  1. 然后我创建了一个新文件 file1.dat 并尝试在其中写入数字 0 五次。 我应该使用什么?

这个

f.write((char*)&num,sizeof(char));

或者这个

f.write((char*)&num,sizeof(int));

为什么我不能按原样写出数字的值而必须将其转换为char*? 这是因为write() 像这样工作还是我只能将字符写入二进制文件?

谁能帮我理解发生了什么?

【问题讨论】:

  • 您应该经常检查文件是否正确打开,例如在使用之前使用'ofstream::is_open'。
  • @soulSurfer2010 谢谢我知道,但这只是演示问题的示例代码。

标签: c++ file file-io binary fstream


【解决方案1】:

函数 write() 是指向数据缓冲区的指针以及要流式传输到文件的数据的长度(以字节为单位)。所以当你说

file.write("this is a message",3);

你告诉 write 函数在文件中写入 3 个字节。那就是“thi”。

这个

f.write((char*)&num,sizeof(char));

告诉 write 函数将 sizeof(char) 字节放入文件中。那是1个字节。你可能想要它

f.write((char*)&num,sizeof(int));

因为 num 是一个 int 变量。

【讨论】:

  • 感谢您的回答。现在假设我更改了写头函数。 int write_header(int h_len, ofstream&amp; f) { int h; for(h=0;h&lt;h_len;h++) { int num = 0; if(h=h_len-1) num = 1; f.write((char*)&amp;num,sizeof(int)); } return 0; } 文件应包含 4 个零 4bytes*4zeros 即 16 个字节和 4 个字节代表 1 值。为什么我没有得到这个?
  • h_lenRPF 的值,即 5。您在 0 和 5 之间迭代(最后一个索引是 4)。那是5个循环。所以你应该在文件中写入 4 个字节的 0 值的 5 倍。总共是 20 个字节的 0
  • 我已经添加了这个if(h=h_len-1) num = 1;,所以我希望得到 4 个零和 1 个。我不明白。
【解决方案2】:
  1. 您正在将 ASCII 字符串“thi”写入 file.dat。如果您在十六进制编辑器中打开文件,您会看到“74 68 69”,这是这些字符的数字表示。但是,如果您在理解 ASCII 的编辑器中打开 file.dat,它很可能会将这些值转换回它们的 ASCII 表示形式,以便于查看。在ios::binary 模式下打开ofstream 意味着数据按原样输出到文件,并且流可能不会事先应用任何转换。

  2. 函数ofstream::write(const char *data, streamsize len) 有两个参数。 data 就是这样,write 对单个字节进行操作。这就是为什么您必须首先将 num 转换为 char* 的原因。第二个参数 len 表示从 data 开始将写入文件的字节数。我的建议是使用write(static_cast&lt;char*&gt;(num), sizeof(num)),然后将num 设置为足够大以存储所需数据的类型。如果您声明int num,那么在 32 位平台上,将向文件写入 20 个零字节。如果您只想要 5 个零字节,则声明为 char num

【讨论】:

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