我正在尝试关于相册项目进行C ++练习。基本上,我需要有4个类,即:持续时间,轨道(持续时间对象+轨道标题),专辑(艺术家姓名,专辑标题和我的Track对象的集合)和AlbumCollection(仅限专辑对象的集合)是可变的。
我通过从键盘分配值或给定值来测试所有类,它们都可以工作。但是,当我试图让他们读取一个txt文件时。它只是在专辑collection.app中循环,永不停止。我知道我的问题出在>>运算符以及我是否对failbit做了错误。但是,我真的不知道该怎么做才能解决这个问题。
这是我的>>持续时间对象中的运算符
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;
}
这是我的&gt;&gt; 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
你可以帮助我吗?我尽力解决但仍然不能这样做:(((((p
非常感谢
答案 0 :(得分:0)
问题出在operator>>
的{{1}}。该运算符尝试尽可能多地读取轨道,直到Album
表示读取失败。然后,Track operator>>
重置流的故障状态。
通过不断重置流的故障状态,即使无法读取艺术家姓名或专辑标题,操作员也无法发出已用尽所有专辑的信号。
由于通常无法分析存储在文件中的“X集合”的结束位置,因此通常会在实际项目之前存储预期数量的项目。 为此,您需要将文件格式更改为(例如):
Album operator>>
如果无法更改文件格式,如果没有要阅读的艺术家和/或相册,您还可以更改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>>
以提前纾困。