将整数作为小端发送到fstream

时间:2013-02-07 11:53:11

标签: c++ fstream

我正在编写创建和保存WAV文件的功能,但我不知道如何将数字发送到流:

ofstream file;
file.open("sound.wav");
file << "RIFF";
file << (int) 32;
file << "WAVE";

我正在尝试实现此WAVE文件结构:https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

问题在这里输出是这样的:

RIFF32WAVE

3 个答案:

答案 0 :(得分:3)

流媒体运营商<<执行格式化输出 - 它将值转换为文本。这不是您想要写入二进制文件格式的。

相反,您希望使用无格式输出函数:put表示单个字节,write表示多个字节:

file.write("RIFF", 4);

// The length field is little-endian, so write the lowest byte first
file.put(length);
file.put(length >> 8);
file.put(length >> 16);
file.put(length >> 24);

file.write("WAVE", 4);

更新:如评论中所述,您还应该以二进制模式打开文件,并使用经典的“C”语言环境对其进行插入,以防止任何内容弄乱您编写的字节:

file.open("sound.wav", std::ios_base::out | std::ios_base::binary);
file.imbue(std::locale::classic());

答案 1 :(得分:0)

您应该以二进制输出模式打开文件,然后打印到文件中。

请参阅this question了解如何操作。

答案 2 :(得分:0)

流运算符用于格式化I / O(文本),而不是二进制。请改为查看write方法。至于小vs大端问题,你可以简单地使用你的操作系统提供的htonl()函数。