快速调用fread会使应用程序崩溃
Rapid calls to fread crashes the application
我正在编写一个函数来加载一个波形文件,在此过程中,如果数据是立体声的,则将其拆分为两个单独的缓冲区。程序到达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);
}
这在我看来是错误的:file + i
你只有一个文件句柄,对吧?不要将i
添加到其中!!
文件是一个文件*和大多数指针一样,我的假设是添加指向指针的整数将从文件中的偏移量中读取。
FILE*是指向FILE结构的指针,该结构存储有关已打开文件的信息。您总是将该指针传递给stdio函数。如果要查找文件中的特定位置,请使用fseek
。如果您只是从开始到结束按顺序读取文件,则不需要查找。
对于任何想要这是我的完整解决方案的人,我会发布这篇文章。事实证明,在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);
}
相关文章:
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- QCompleter set模型使应用程序崩溃
- Qt 5 应用程序崩溃并出现"qLineEdit::setText"
- 切换NvAPI_Stereo_Deactivate/NvAPI_Stereo_activate会使unity应用程序崩溃
- eglSwapBuffers上的应用程序崩溃
- VLD 使应用程序崩溃
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- 执行递归函数时 C++ 应用程序崩溃
- 在 C++/CLI/C# 项目中启用"Native Code Debugging"导致应用程序崩溃
- LOCAL_SHARED_LIBRARIES使我的应用程序崩溃
- 为什么使用 nullPtr 调用函数不会使我的应用程序崩溃
- 当删除上下文属性中的QLIST对象时,QT QML应用程序崩溃
- React 本机 0.59 应用程序崩溃并出现 libc 错误
- 当使用“制造”编译的程序中使用库时,应用程序崩溃
- 如何在导致应用程序崩溃的代码中修复指令
- C++多线程应用程序崩溃
- 当使用 /ENTRY:main 和 /MT 运行时库编译为 /SUBSYSTEM:WINDOWS 时,应用程序崩溃