我对C ++完全陌生,只用了几个小时的自学,从昨天开始。 所以:
我有一个未压缩的简单beep.wav
文件,只有大约3秒钟的时间,只有一声哔哔声。
我最终想要实现的只是阅读文件,同时编写二进制数据,包括:标题, ftm 和 data 或所有十六进制可读数据并将其转储到简单的beep.txt
文件中。
这是可能的,在C ++中?如果是这样,我应该如何开始阅读和转储二进制文件?
我可以使用<fstream>
类
#include <iostream>
#include <fstream>
int main()
{
ifstream myfile ("beep.wav", ios::in|ios::binary|ios::ate);
if (myfile.is_open())
{
//reading goes here
}
return 0;
}
答案 0 :(得分:3)
如yzt
所述,您需要提前知道.wav
中的内容以及顺序。据我所知,您将拥有标签,标题和值(样本)以及压缩信息。所以,开始吧:
如果您知道,例如,首先要做的是读取压缩率,您将通过提取开始阅读过程可能是double
:
ifstream myfile("beep.wav", ios::in|ios::binary);
double compression_rate;
myfile.read((char*)&compression_rate, sizeof(compression_rate));
// As well as probably the sample rate...
double sample_rate;
myfile.read((char*)&sample_rate, sizeof(sample_rate));
然后,可能是,样本数量:
int nb_samples;
myfile.read((char*)&nb_samples, sizeof(nb_samples));
然后,这些样本的值...(此处存储为vector
的{{1}}
double
等等...
但是,你打开的vector<double> vect;
vect.resize(nb_samples);
myfile.read((char*)&vect[0], nb_samples * sizeof(double));
又是什么?
一旦你完全掌握了内容,你就可以走另一条路,开始从头开始编写自己的.wav
......
Getting started - 和here。
答案 1 :(得分:2)
此示例将从输入文件中读取数据并将其写为2个字符的十六进制值(文本)。
ofstream outfile("beep.txt");
outfile << hex << setfill('0');
char c;
while( outfile.good() && myfile.get(c) )
{
outfile << setw(2) << +(unsigned char)c;
}
答案 2 :(得分:2)
WAV file format specification告诉你WAV文件的二进制布局 - 你需要这个,因为它告诉你按什么顺序读取哪些字节。 (除了字节之外,您还需要阅读int
- s和各种其他字段。)一旦您阅读了这些信息,您就可以将其翻译为显示并将其写入文本文件。例如,您可以通过读取标题(我不知道确切的布局)来写出WAV文件中声音的长度(持续时间),然后计算转换为的秒数。
在技术方面,你问题的所有其他答案都很好 - 它们会指导你如何读/写二进制和&amp; C ++中的文本数据。
答案 3 :(得分:1)
您可以将整个文件读入缓冲区:
myfile.seekg(0, std::ios::end);
std::string buffer(myfile.tellg(), '\0');
myfile.seekg(0);
myfile.read(&buffer.front(), buffer.size());