0

我尝试制作一个 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 首歌曲,一切都很完美。我不知道可能是什么问题。我试图写块,并从内存中删除这些块,我使用了刷新。我不知道该怎么办,问题可能出在哪里。如果我写控制台这些信息(一个用于打印的for循环)一切都是完美的,但是当我尝试写时......崩溃。

可能是什么问题呢?

4

1 回答 1

0

对我来说,你如何遍历歌曲列表this->getSize()然后获取SongInfowith看起来很奇怪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;
}

甚至更好,如果songsQList

foreach(SongInfo si, songs){
   int durata = this->getLengthInSeconds(si.getAddress().toString(QUrl::None));
   ...
}
于 2012-05-17T00:21:27.927 回答