我正在编写一个加载波形文件的函数,并且在此过程中,如果它是立体声,则将数据拆分为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);
}
答案 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(¶ms.leftChannelData[offset], &buf[i], stride * sizeof(BYTE));
else{
memcpy(¶ms.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);
}