我尝试制作一个M3U文件(播放列表),但是当我尝试编写文件时,我的程序崩溃而没有错误。
bool Playlist::savePlaylist(QString path)
{
this->filename = path;
QFile file(path);
if((file.open(QIODevice::WriteOnly | QIODevice::Truncate)) == false)
{
return false;
}
QTextStream out(&file);
if(out.status() != QTextStream::Ok)
{
return false;
}
out << "#EXTM3U" << endl;
for(int i = 0 ; i < this->getSize() ; i++)
{
SongInfo si = this->songs.at(i);
int durata = this->getLengthInSeconds(si.getAddress().toString(QUrl::None));
out << "#EXTINF:" << durata << "," << ID3_GetArtist(&si.getTag()) << " - "
<< ID3_GetTitle(&si.getTag()) << endl;
out << si.getAddress().toString(QUrl::None) << endl;
}
file.close();
return true;
}
如果我尝试使用188个文件,光盘上的1.07 Gb大小,在大约100首歌曲之后程序崩溃。当我试图将SongInfo放到那个位置时,我得到了崩溃。如果我试着说30-40首歌曲,一切都很完美。我不知道会出现什么问题。我试图写块,并从内存中删除那些块,我用过flush。我不知道该怎么做,问题出在哪里。如果我写控制台那些信息(一个for循环只是为了打印)一切都很完美,但当我试着写...崩溃。
可能是什么问题?
答案 0 :(得分:0)
对我而言,如何使用this->getSize()
迭代歌曲列表,然后使用SongInfo
获取this->songs.at(i);
,这看起来很奇怪。
this
与this->songs
不是同一个对象,只是通过查看您的代码,无法知道getSize()
的作用。
你想尝试一下吗?
int size = songs.size();
for(int i = 0 ; i < size ; i++)
{
SongInfo si = this->songs.at(i);
int durata = this->getLengthInSeconds(si.getAddress().toString(QUrl::None));
out << "#EXTINF:" << durata << "," << ID3_GetArtist(&si.getTag()) << " - "
<< ID3_GetTitle(&si.getTag()) << endl;
out << si.getAddress().toString(QUrl::None) << endl;
}
甚至更好,如果songs
是QList
:
foreach(SongInfo si, songs){
int durata = this->getLengthInSeconds(si.getAddress().toString(QUrl::None));
...
}