似乎当你试图从taglib中的mp3获得评级并且它已被打开时,它将导致读取访问冲突:
这是我的代码:
QFile fileInfo(file);
fileInfo.open(QIODevice::ReadOnly);
if(fileInfo.isReadable())
{
TagLib::MPEG::File mpeg(file.toStdString().c_str());
bool isRead = mpeg.isReadable(file.toStdString().c_str());
if(isRead)
rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating();
}
我尝试过添加try / catch但它仍然失败。我尝试过QLockFile但没有成功。有没有办法测试文件是否具有文件的专有权或捕获读访问冲突?
更新 感谢我的提示,我修改了我的代码,首先检查无效值:
if(mpeg.ID3v2Tag() != 0)
{
if(dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front()) != 0)
{
rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating();
}
}
答案 0 :(得分:1)
读取访问冲突与文件读取无关,程序尝试对其无法访问的内存进行读取访问。
在您的情况下,您尝试访问空指针(0x0
)。
在最后一行代码中有两个指针访问操作,在尝试调用方法之前,它们都不是空指针
答案 1 :(得分:0)
由于this question中的代码,您已经遇到了这个问题。您以错误的方式创建POPM
框架,然后投射失败。
注意:dynamic_cast
是经过检查的演员类型。它失败时返回零,就像它在这里一样。您需要在假设它起作用之前检查返回值(否则您通常会使用static_cast
)。