-3

アルバムプロジェクトについてC++の演習を行おうとしています。基本的に、Duration、Track(durationオブジェクト+トラックのタイトル)、Album(アーティストの名前、アルバムのタイトル、Trackオブジェクトのコレクション)、AlbumCollection(Albumオブジェクトのコレクションのみ)の4つのクラスが必要です。可変です。

キーボードから値または指定された値を割り当てることによってすべてのクラスをテストしましたが、それらはすべて機能します。しかし、私が彼らにtxtファイルを読むように頼もうとすると。アルバムcollection.appでループし続け、停止することはありません。私の問題は>>演算子にあり、フェイルビットで何か問題があったかどうかを知っています。しかし、私はこれを修正するために何をすべきか本当にわかりません。

これはDurationオブジェクトの>>演算子です

inline std::istream& operator >> (std::istream& is, Duration& f)
{
    char c;
    int h,m,s;

if (is >> h >> c >> m >> c >> s){
    if (c==':'){
        f = Duration (h,m,s);
    }
    else{
        is.clear(std::ios_base::failbit);
    }
} else{
    is.clear(std::ios_base::failbit);
}
return is;

}

これはTrackオブジェクトの私の>>演算子です

istream& operator>>(istream& is, Track& t){
    Duration duration;
    char trackTitle[256];
    char c1;

if (is>>duration>>c1){
        is.getline(trackTitle,256);
        t = Track(duration,trackTitle);

}
    else{
        is.clear(ios_base::failbit);
    }
return is;

}

これはAlbumクラスの私の>>演算子です

istream& operator>>(istream& is, Album& album){
    char artistName[256];
    char albumTitle [256];
    vector<Track> trackCollection;
    Track track;


is.getline(artistName, 256, ':');
is.getline(albumTitle, 256);

while ((is>>track) && (!is.fail())){

    trackCollection.push_back(track);
}

album = Album(artistName,albumTitle,trackCollection);

if (is.eof()){
    is.clear(ios_base::failbit);
    is.ignore(256,'\n');
}
else{
    is.clear();
}

    return is;

}

これはAlbumCollectionクラスの私の>>演算子です

std::istream& operator>>(std::istream& is,AlbumCollection& albumCollection){
    Album album;

vector<Album>albums;
    while (is>>album) {

        albumCollection.addAlbum(album);
    }

    return is;

}

and the format of the input file .txt is: 
The Jimi Hendrix Experience: Are you Experienced? 
0:03:22 - Foxy Lady
0:03:32 - Highway Chile
Pink Floyd: Dark Side of the Moon
0:01:30 - Speak to Me
0:02:43 - Breathe

それについて私を助けてくれませんか?私は解決するために最善を尽くしましたが、それでも私はこれを行うことができません:(((((

本当にありがとうございました

4

1 に答える 1

0

問題はのにoperator>>ありAlbumます。そのオペレーターは、読み取りの失敗を通知するまで、できるだけ多くのトラックを読み取ろうとしますTrack operator>>。その後、Album operator>>ストリームの障害ステータスがリセットされます。ストリームの失敗ステータスを継続的にリセットすることで、アーティスト名やアルバム タイトルを読み取ることができなかったとしても、オペレーターはすべてのアルバムを使い果たしたことを通知できません。

通常、「X のコレクション」がファイルに格納されたときにどこで終了するかを判断することはできないため、実際のアイテムの前に予想されるアイテム数を格納するのが通例です。そのためには、ファイル形式を (たとえば) 次のように変更する必要があります。

2
The Jimi Hendrix Experience: Are you Experienced? 
2
0:03:22 - Foxy Lady
0:03:32 - Highway Chile
Pink Floyd: Dark Side of the Moon
2
0:01:30 - Speak to Me
0:02:43 - Breathe

ファイル形式を変更できない場合は、読み取るアーティストやアルバムがない場合に、 operator>>forを変更して早期に救済することもできます。Album

于 2012-12-11T19:04:26.027 に答える