快速调用fread会使应用程序崩溃

时间:2012-09-13 03:31:19

标签: c++ audio wav fread

我正在编写一个加载波形文件的函数,并且在此过程中,如果它是立体声,则将数据拆分为2个单独的缓冲区。程序到达i = 18并在左通道fread过程中崩溃。 (您可以忽略couts,它们只是用于调试。)也许我应该一次加载文件并使用memmove来填充缓冲区?

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);
}

2 个答案:

答案 0 :(得分:3)

这对我来说不对:file + i

你只有一个文件句柄,对吗?不要添加i !!

  

文件是一个文件*我的假设是,像大多数指针一样,添加一个   指针的整数将从文件中的偏移量读取。

FILE *是指向FILE结构的指针,该结构存储有关您打开的文件的信息。您始终将该指针传递给stdio函数。如果要查找文件中的特定位置,请使用fseek。如果您只是从头到尾按顺序读取文件,则无需搜索。

答案 1 :(得分:0)

对于任何想要我完整解决方案的人,我都会发布这个。事实证明,在fread调用之间循环比在memcpy调用之间循环的一个fread调用慢得多(虽然它需要两倍的内存)。我发布的代码中的另一个问题是我说:

isLeft != isLeft;

而不是

isLeft = !isLeft;

解决方案:

if(params.channels == 2){
    params.leftChannelData = new unsigned char[params.dataSize/2];
    params.rightChannelData = new unsigned char[params.dataSize/2];
    unsigned char * buf = new unsigned char[params.dataSize];

    fread(buf, sizeof(BYTE), params.dataSize, file);

    bool isLeft = true;

    int offset = 0;
    const int stride = params.bitsPerSample/8;

    for(int i = 0; i < params.dataSize; i += stride)
    {

        if(isLeft)
            memcpy(&params.leftChannelData[offset], &buf[i], stride * sizeof(BYTE));
        else{
            memcpy(&params.rightChannelData[offset], &buf[i], stride * sizeof(BYTE));
            offset += stride;
        }
        isLeft = !isLeft;
    }

    params.dataSize = params.dataSize/2;

    delete(buf);

} else {
    params.leftChannelData = new unsigned char[params.dataSize];
    params.rightChannelData = NULL;
    fread(params.leftChannelData, sizeof(BYTE), params.dataSize, file);
}