我有一个问题,我不确定如何解决。我有一个打开.wav文件的C ++函数,将样本读入一个双精度数组,该数组的索引数与.wav文件中的样本数一样多,并返回指向该数组的指针。这非常有效。
我想要做的是读取多个.wav文件并将它们存储在二维数组中。虽然我知道会有多少数组,但每个数组的大小会有所不同,因为所有.wav文件都有不同的样本数。我不知道如何为多个文件正确存储这些数据。
这是对wav2sig的调用,该函数打开.wav并返回一个指针:
double* wav2sig(std::string filepath, int & num_samples)
以下是我正在处理的代码。粗略地说。
std::string paths[3] = {"man1.wav",
"man2.wav",
"man3.wav"};
double **data = new double[3][]; //this would work in java, but not here
int num_samples[3];
for(int i = 0; i < 3; i++) {
data[i] = wav2sig(paths[i], num_samples[i]);
for(int j = 50; j < 100; j++)
std::cout << data[i][j] << " ";
std::cout << std::endl;
}
我知道返回的指针具有所有正确的数据。我只是不知道如何正确存储其中几个。谢谢你的帮助!
答案 0 :(得分:0)
我强烈建议对数组使用std::vector
而不是指向动态分配内存的指针。它们同样易于使用,它们消除了管理记忆的麻烦。
wav2sig
std::vector<double> wav2sig(std::string filepath);
我猜测num_samples
用于返回返回数组中的元素数。当您使用std::vector<double>
作为返回类型时,返回值的大小将捕获该值。因此,不需要额外的输出参数。
std::vector<std::vector<double>>
作为2D数组。std::vector<std::vector<double>> data;
// Separate reading of the data from files from outputting the data
// Read the data
for(int i = 0; i < 3; i++) {
data.push_back(wav2sig(paths[i]);
}
// Output the data
for(int i = 0; i < 3; i++) {
for(size_t j = 0; j < data[i].size(); j++)
std::cout << data[i][j] << " ";
std::cout << std::endl;
}