2017-01-02 14 views
0

Похоже, когда вы пытаетесь получить рейтинг от mp3 в TagLib и его было открыто, что приведет к нарушению прав доступа на чтение:библиотека теги Qt чтения нарушения доступа

enter image description here

Вот мой код:

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

Я попытался добавить попытку/уловку, но она все еще терпит неудачу. Я пробовал QLockFile без успеха. Есть ли способ проверить, имеет ли файл исключительные права на файл или поймать нарушение доступа к чтению?

Update Благодаря наконечнику я изменил мой код, чтобы проверить наличие недопустимых значений первых:

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

ответ

1

нарушение прав доступа пользователя не имеет ничего общего с файла читать, вы программа пытается сделать доступ для чтения памяти, к которой он недоступен.

В вашем случае вы пытаетесь получить доступ к нулевому указателю (0x0).

У вас есть две операции доступа указатель в последней строке кода, cehck как за не пустой указатель, прежде чем пытаться вызвать методы их

+0

Что такое хороший способ разделить это. Когда я сначала пытаюсь использовать TagLib :: ID3v2 :: Tag * id3v2 = mpeg.ID3v2Tag(); Я получаю id3v2 uneclared identifier – adviner

+0

Странно, это выглядит верным для меня, если 'Tag' является допустимым типом в пространстве имен' TagLib :: ID3v2' –

0

Вы ударяя эту проблему из-за кода, который вы имели в this question , Вы создаете фрейм POPM неправильным образом, а затем литье не работает.

Примечание: dynamic_cast - проверенный тип литья. Он возвращает ноль, когда он терпит неудачу, как он есть здесь. Вам нужно проверить возвращаемое значение, прежде чем считать, что оно работает (в противном случае вы обычно используете static_cast).