我有以下代码,我正在尝试在二进制文件中写入一些数据。 问题是我没有任何二进制文件的经验,我无法理解我在做什么。
#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值。为什么会这样?
此
f.write((char*)&num,sizeof(char));
或者
f.write((char*)&num,sizeof(int));
为什么我不能按原样写出数字的值,我必须将其转换为char*
?
这是因为write()
是这样工作还是我只能将字符写入二进制文件?
有谁能帮我理解发生了什么?
答案 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)
您正在将ASCII字符串“thi”写入file.dat。如果您在十六进制编辑器中打开文件,您将看到“74 68 69”,这是这些字符的数字表示。但是如果你在一个理解ASCII的编辑器中打开file.dat,它很可能会将这些值转换回它们的ASCII表示,以便于查看。在ofstream
模式下打开ios::binary
意味着数据按原样输出到文件,并且流之前不会对流应用任何转换。
函数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
。