3

我对 C++ 完全陌生,只有几个小时的自学,从昨天开始。所以:

我有一个未压缩的简单beep.wav文件,只有大约 3 秒长,里面有一个哔哔声。

我最终想要实现的是,只是读取文件,同时写入二进制数据,包括:headerftmdata或所有十六进制可读数据并将其转储到一个简单的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;
    }
4

4 回答 4

3

如前所述yzt,您需要提前知道您的物品.wav和顺序。据我所知,您将拥有标签、标题和值(样本)以及压缩信息。所以,首先:

例如,如果您知道首先要做的是读取压缩率,那么您将通过提取可能是 a 来开始您的阅读过程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));

然后,这些样本的值......(这里存储为 a vectorof double

vector<double> vect;
vect.resize(nb_samples);
myfile.read((char*)&vect[0], nb_samples * sizeof(double));

ETC...

但同样,.wav你打开的东西是由什么制成的?

一旦你完全掌握了内容,你就可以另辟蹊径,从头开始编写自己.wav的...


开始-在这里

字节 - PCM Wav 文件的“尸检”

于 2013-06-17T01:14:27.663 回答
2

WAV 文件格式规范告诉您 WAV 文件的二进制布局 - 您需要它,因为它告诉您以什么顺序读取哪些字节。(除了字节之外,您确实需要阅读int-s 和各种其他字段。)一旦您阅读了这些信息,就可以将其翻译以显示并将其写入文本文件。例如,您可以通过读取标题(我不知道确切的布局)在 WAV 文件中写出声音的长度(持续时间),然后计算转换为多少秒。

用技术术语来说,您问题的所有其他答案都很好——它们为您提供了有关如何在 C++ 中读取/写入二进制和文本数据的指示。

于 2013-06-17T01:42:05.097 回答
2

此示例将从输入文件中读取数据并将其写入为 2 个字符的十六进制值(文本)。

ofstream outfile("beep.txt");
outfile << hex << setfill('0');

char c;
while( outfile.good() && myfile.get(c) )
{
    outfile << setw(2) << +(unsigned char)c;
}
于 2013-06-17T01:14:51.397 回答
1

您可以将整个文件读入缓冲区:

  1. 查找文件末尾
  2. 制作一个足够大的缓冲区以容纳文件
  3. 回到文件的开头
  4. 将整个文件读入缓冲区

myfile.seekg(0, std::ios::end);
std::string buffer(myfile.tellg(), '\0');
myfile.seekg(0);

myfile.read(&buffer.front(), buffer.size());
于 2013-06-17T01:13:24.667 回答