【发布时间】:2010-12-10 00:59:54
【问题描述】:
我正在使用 TagLib(在 Windows 上,使用 MingW 构建)。我试图让 TagLib 识别 MP3 文件中何时没有 ID3v1 或 ID3v2 信息。根据TagLib documentation,当文件中没有 ID3v2 信息时,MPEG 文件对象中的 ID3v2Tag() 函数应该返回一个 NULL 指针。
很遗憾,这并没有发生。我有一些我在我的代码中使用的测试 MP3 文件(我已经使这些文件可用):
- blank.mp3 (download),根本没有 ID3v1 或 ID3v2 信息。我可以通过在文件二进制内容中对“TAG”和“ID3”进行纯文本搜索来确认这一点。
- only_album_id3v2.mp3 (download),有ID3v2信息(只设置了专辑)
- only_album_id3v1.mp3 (download),有ID3v1信息(只设置了专辑)
这是我的代码。
#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;
}
由于cout << at->album() << endl; 上的空指针错误,运行该程序应该会中断,但它运行得很好。另外,当我cout << ct << endl;时,它返回一个内存地址。
这是输出:
测试。
测试专辑id3v2
程序完成。
编辑: 这是一个新的测试。
#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;
}
这是输出。
测试。
at 不为 NULL。
bt 不为 NULL。
ct 不为 NULL。
程序完成。
【问题讨论】:
-
你期待什么?例外?如果我没看错的话,您将 NULL 值传递给一个流,该流不会在控制台中输出。这不是预期的吗?
-
The program is done.真的输出了吗?因为我在你的源代码中没有看到。 -
@Kissaki,如果 ct 为 NULL,
cout << ct << endl;不应该向流输出 0 吗?此外,我修复了代码示例以匹配输出。之前,我更新了输出,但没有更新代码。现在他们匹配了 -
我不确定。不过,就我个人而言,为 NULL 不打印任何内容对我来说会更直观。不知道规格或任何内容怎么说。 /e:哦,那个输出现在很有趣。 :)