-3

我正在尝试做关于专辑项目的 C++ 练习。基本上,我需要有 4 个类,即:Duration、Track(持续时间对象 + 曲目标题)、Album(艺术家姓名、专辑标题和我的 Track 对象的集合)和 AlbumCollection(只有专辑对象的集合)是可变的。

我确实通过从键盘分配值或给定值来测试所有类,它们都可以工作。但是,当我尝试让他们读取 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;

}

这是专辑类中的 >> 运算符

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>>forAlbum以提早退出。

于 2012-12-11T19:04:26.027 回答