Ich spiele mit TagLib (unter Windows, mit MingW). Ich versuche TagLib zu erkennen, wenn keine ID3v1- oder ID3v2-Informationen in einer MP3-Datei vorhanden sind. Laut der TagLib documentation sollte die ID3v2Tag() - Funktion in einem MPEG-Dateiobjekt einen Nullzeiger zurückgeben, wenn keine ID3v2-Informationen in der Datei vorhanden sind.Unerwartete Non-NULL-Rückgabe
Leider tritt dies nicht auf. Ich habe einige Test MP3-Dateien, die ich gemacht habe, dass ich in meinem Code verwenden (ich die Dateien zur Verfügung gestellt haben):
- blank.mp3 (download), überhaupt kein ID3v1 oder ID3v2 Informationen. Ich kann dies bestätigen, indem ich eine einfache Textsuche nach "TAG" und "ID3" im binären Inhalt der Dateien durchführe.
- only_album_id3v2.mp3 (download), ID3v2 Informationen hat (nur das Album gesetzt)
- only_album_id3v1.mp3 (download), hat ID3v1 Informationen (nur das Album gesetzt)
Hier ist mein Code.
#include <iostream>
#include <mpeg/mpegfile.h>
#include <mpeg/id3v2/id3v2tag.h>
using namespace std;
int main()
{
cout << "Test." << endl;
TagLib::MPEG::File a("tests/other/blank.mp3");
TagLib::MPEG::File b("tests/id3v2/only_album_id3v2.mp3");
TagLib::MPEG::File c("tests/id3v1/only_album_id3v1.mp3");
TagLib::ID3v2::Tag * at = a.ID3v2Tag();
TagLib::ID3v2::Tag * bt = b.ID3v2Tag();
TagLib::ID3v2::Tag * ct = c.ID3v2Tag();
cout << at->album() << endl;
cout << bt->album() << endl;
cout << ct->album() << endl;
cout << "The program is done.";
return 0;
}
Das Ausführen dieses Programms brechen sollte, entstand durch einen NULL-Zeiger Fehler auf cout << at->album() << endl;
, aber es läuft ganz gut. Auch wenn I cout << ct << endl;
, gibt es eine Speicheradresse zurück. Hier
ist die Ausgabe:
-Test.
Test Album id3v2
Das Programm durchgeführt wird.
EDIT: Hier ist ein neuer Test.
#include <iostream>
#include <mpeg/mpegfile.h>
#include <mpeg/id3v2/id3v2tag.h>
using namespace std;
int main()
{
cout << "Test." << endl;
TagLib::MPEG::File a("tests/other/blank.mp3");
TagLib::MPEG::File b("tests/id3v2/only_album_id3v2.mp3");
TagLib::MPEG::File c("tests/id3v1/only_album_id3v1.mp3");
TagLib::ID3v2::Tag * at = a.ID3v2Tag();
TagLib::ID3v2::Tag * bt = b.ID3v2Tag();
TagLib::ID3v2::Tag * ct = c.ID3v2Tag();
if(at == NULL)
{
cout << "at is NULL.";
}
else
{
cout << "at is not NULL.";
}
cout << endl;
if(bt == NULL)
{
cout << "bt is NULL.";
}
else
{
cout << "bt is not NULL.";
}
cout << endl;
if(ct == NULL)
{
cout << "ct is NULL.";
}
else
{
cout << "ct is not NULL.";
}
cout << endl;
cout << "The program is done.";
return 0;
}
Und hier ist der Ausgang.
Test.
bei ist nicht NULL.
BT ist nicht NULL.
ct ist nicht NULL.
Das Programm ist fertig.
Was erwarten Sie? Eine Ausnahme? Sie übergeben NULL-Werte an einen Stream, der nicht in der Konsole ausgegeben wird, wenn ich das richtig sehe. Ist das nicht erwartet? – Kissaki
Ist das 'Das Programm fertig 'wirklich ausgegeben? Wie ich das in deinem Quellcode nicht sehe. – Kissaki
@Kissaki, sollte nicht 'cout << ct << endl;' eine 0 an den Stream ausgeben, wenn ct NULL ist? Außerdem habe ich das Codebeispiel an die Ausgabe angepasst. Vorher habe ich die Ausgabe aktualisiert, aber nicht den Code. Jetzt stimmen sie überein –