我正在编写一个函数来加载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/

10-13 06:03