我正在编写一个函数来加载wave文件,并在此过程中将数据拆分为2个单独的缓冲区(如果是立体声)。程序进入i = 18并在左通道fread pass期间崩溃。 (您可以忽略提示,它们仅在调试时使用。)也许我应该一次性加载文件并使用记忆体填充缓冲区?
if(params.channels == 2){
params.leftChannelData = new unsigned char[params.dataSize/2];
params.rightChannelData = new unsigned char[params.dataSize/2];
bool isLeft = true;
int offset = 0;
const int stride = sizeof(BYTE) * (params.bitsPerSample/8);
for(int i = 0; i < params.dataSize; i += stride)
{
std::cout << "i = " << i << " ";
if(isLeft){
std::cout << "Before Left Channel, ";
fread(params.leftChannelData+offset, sizeof(BYTE), stride, file + i);
std::cout << "After Left Channel, ";
}
else{
std::cout << "Before Right Channel, ";
fread(params.rightChannelData+offset, sizeof(BYTE), stride, file + i);
std::cout << "After Right Channel, ";
offset += stride;
std::cout << "After offset incr.\n";
}
isLeft != isLeft;
}
} else {
params.leftChannelData = new unsigned char[params.dataSize];
fread(params.leftChannelData, sizeof(BYTE), params.dataSize, file);
}
最佳答案
这对我来说似乎是错误的:file + i
您只有一个文件句柄,对吗?不要添加i
!
FILE *是指向FILE结构的指针,该结构存储有关已打开文件的信息。您总是将指针传递给stdio函数。如果要查找文件中的特定位置,请使用fseek
。如果您只是从头到尾顺序读取文件,则无需查找。
关于c++ - 快速调用fread会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12399047/