C ++和二进制文件 - 新手问题

时间:2011-05-15 14:08:22

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

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

#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五次。 我该用什么?
  2. f.write((char*)&num,sizeof(char));
    

    或者

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

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

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

2 个答案:

答案 0 :(得分:2)

函数write()表示指向数据缓冲区的指针以及要传输到文件的数据的字节长度。所以当你说

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

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

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

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

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

因为num是一个int变量。

答案 1 :(得分:0)

  1. 您正在将ASCII字符串“thi”写入file.dat。如果您在十六进制编辑器中打开文件,您将看到“74 68 69”,这是这些字符的数字表示。但是如果你在一个理解ASCII的编辑器中打开file.dat,它很可能会将这些值转换回它们的ASCII表示,以便于查看。在ofstream模式下打开ios::binary意味着数据按原样输出到文件,并且流之前不会对流应用任何转换。

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