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

ディスク上のサイズが 1.07 Gb の 188 個のファイルで試してみると、約 100 曲の後でプログラムがクラッシュします。その位置で SongInfo を取得しようとすると、クラッシュします。30 ~ 40 曲を試してみると、すべてが完璧に機能します。何が問題なのかわかりません。チャンクを書き込もうとして、それらのチャンクをメモリから削除しようとしましたが、フラッシュを使用しました。どこに問題があるのか​​ 、何をすべきかわかりません。これらの情報をコンソールに書き込むと(印刷のためだけの for ループ)、すべてが完璧ですが、書き込もうとすると...クラッシュします。

何が問題なのですか?

4

1 に答える 1

0

私には、曲リストを で反復処理してから with を取得する方法が奇妙に見えthis->getSize()ます。 は と同じオブジェクトではなく、コードを見ただけでは何が機能するかを知ることはできません。SongInfothis->songs.at(i);thisthis->songsgetSize()

これを試してみませんか?

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));
   ...
}
于 2012-05-17T00:21:27.927 に答える