在c++中读写二进制文件



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

我有一个未压缩的简单beep.wav文件,只有大约3秒长,其中有一个单一的蜂鸣声。

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

正如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));

那么,这些样本的值…(这里存储为doublevector)

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

等等……

但是,你打开的.wav是什么做的呢?

一旦你完全掌握了内容,你可以走另一条路,开始从头开始编写自己的.wav


Getting started - and here

Bytes - "Autopsy"

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

ofstream outfile("beep.txt");
outfile << hex << setfill('0');
char c;
while( outfile.good() && myfile.get(c) )
{
    outfile << setw(2) << +(unsigned char)c;
}

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

在技术术语中,你的问题的所有其他答案都是好的-他们给你如何读/写二进制&

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

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

:

myfile.seekg(0, std::ios::end);
std::string buffer(myfile.tellg(), '');
myfile.seekg(0);
myfile.read(&buffer.front(), buffer.size());

最新更新